﻿<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/atom.xsl" media="screen"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title type="html">ScottGu's Blog </title>
  <subtitle type="html">Scott Guthrie lives in Seattle and builds a few products for Microsoft</subtitle>
  <id>http://weblogs.asp.net/scottgu/atom.aspx</id>
  <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/default.aspx" />
  <link rel="self" type="application/atom+xml" href="http://weblogs.asp.net/scottgu/atom.aspx" />
  <generator uri="http://communityserver.org" version="3.0.20510.895">Community Server</generator>
  <updated>2010-11-04T20:06:39Z</updated>
  <entry>
    <title>ASP.NET MVC 3: Implicit and Explicit code nuggets with Razor</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/12/16/asp-net-mvc-3-implicit-and-explicit-code-nuggets-with-razor.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/12/16/asp-net-mvc-3-implicit-and-explicit-code-nuggets-with-razor.aspx</id>
    <published>2010-12-17T07:23:11Z</published>
    <updated>2010-12-17T07:23:11Z</updated>
    <content type="html">&lt;font size="2" face="arial"&gt;   &lt;p&gt;This is another in a series of posts I’m doing that cover some of the new ASP.NET MVC 3 features:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/10/19/asp-net-mvc-3-new-model-directive-support-in-razor.aspx" target="_blank"&gt;New @model keyword in Razor (Oct 19th)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx" target="_blank"&gt;Layouts with Razor (Oct 22nd)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/11/12/asp-net-mvc-3-server-side-comments-with-razor.aspx" target="_blank"&gt;Server-Side Comments with Razor (Nov 12th)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/12/15/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax.aspx" target="_blank"&gt;Razor’s @: and &amp;lt;text&amp;gt; syntax (Dec 15th)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;Implicit and Explicit code nuggets with Razor (today) &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;In today’s post I’m going to discuss how Razor enables you to both implicitly and explicitly define code nuggets within your view templates, and walkthrough some code examples of each of them.&amp;#160; &lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Fluid Coding with Razor&lt;/u&gt;&lt;/h3&gt;    &lt;h6&gt;&lt;/h6&gt;    &lt;p&gt;ASP.NET MVC 3 ships with a new view-engine option called “Razor” (in addition to the existing .aspx view engine).&amp;#160; You can learn more about Razor, why we are introducing it, and the syntax it supports from my &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx"&gt;Introducing Razor&lt;/a&gt; blog post.&lt;/p&gt;    &lt;p&gt;Razor minimizes the number of characters and keystrokes required when writing a view template, and enables a fast, fluid coding workflow. Unlike most template syntaxes, you do not need to interrupt your coding to explicitly denote the start and end of server blocks within your HTML. The Razor parser is smart enough to infer this from your code. This enables a compact and expressive syntax which is clean, fast and fun to type.&lt;/p&gt;    &lt;p&gt;For example, the Razor snippet below can be used to iterate a collection of products and output a &amp;lt;ul&amp;gt; list of product names that link to their corresponding product pages:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_5E9ACF1C.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_4EAB8A58.png" width="520" height="181" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;When run, the above code generates output like below:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_66CEF4B3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_13E3E182.png" width="534" height="344" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Notice above how we were able to embed two code nuggets within the content of the foreach loop.&amp;#160; One of them outputs the name of the Product, and the other embeds the ProductID within a hyperlink.&amp;#160; Notice that we didn’t have to explicitly wrap these code-nuggets - Razor was instead smart enough to &lt;em&gt;implicitly&lt;/em&gt; identify where the code began and ended in both of these situations.&amp;#160; &lt;/p&gt;    &lt;h3&gt;&lt;u&gt;How Razor Enables Implicit Code Nuggets&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Razor &lt;u&gt;does not&lt;/u&gt; define its own language.&amp;#160; Instead, the code you write within Razor code nuggets is standard C# or VB.&amp;#160; This allows you to re-use your existing language skills, and avoid having to learn a customized language grammar.&lt;/p&gt;    &lt;p&gt;The Razor parser has smarts built into it so that whenever possible you do not need to explicitly mark the end of C#/VB code nuggets you write.&amp;#160; This makes coding more fluid and productive, and enables a nice, clean, concise template syntax.&amp;#160; Below are a few scenarios that Razor supports where you can avoid having to explicitly mark the beginning/end of a code nugget, and instead have Razor&lt;em&gt; implicitly identify the code nugget scope&lt;/em&gt; for you:&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Property Access&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;Razor allows you to output a variable value, or a sub-property on a variable that is referenced via “dot” notation:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_130B7B98.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_247BDC70.png" width="461" height="43" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;You can also use “dot” notation to access sub-properties multiple levels deep:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_31E1EF76.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_713FA306.png" width="308" height="45" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;&lt;u&gt;Array/Collection Indexing:&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;Razor allows you to index into collections or arrays:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_69B43399.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_5E1E765A.png" width="536" height="46" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;&lt;u&gt;Calling Methods:&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;Razor also allows you to invoke methods:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_569306ED.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_211A44C8.png" width="556" height="47" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Notice how for all of the scenarios above how we &lt;u&gt;did not&lt;/u&gt; have to explicitly end the code nugget.&amp;#160; Razor was able to implicitly identify the end of the code block for us.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Razor’s Parsing Algorithm for Code Nuggets&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;The below algorithm captures the core parsing logic we use to support “@” expressions within Razor, and to enable the implicit code nugget scenarios above: &lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;Parse an identifier - As soon as we see a character that isn't valid in a C# or VB identifier, we stop and move to step 2 &lt;/li&gt;      &lt;li&gt;Check for brackets - If we see &amp;quot;(&amp;quot; or &amp;quot;[&amp;quot;, go to step 2.1., otherwise, go to step 3&amp;#160; &lt;ol&gt;         &lt;li&gt;Parse until the matching &amp;quot;)&amp;quot; or &amp;quot;]&amp;quot; (we track nested &amp;quot;()&amp;quot; and &amp;quot;[]&amp;quot; pairs and ignore &amp;quot;()[]&amp;quot; we see in strings or comments) &lt;/li&gt;          &lt;li&gt;Go back to step 2 &lt;/li&gt;       &lt;/ol&gt;     &lt;/li&gt;      &lt;li&gt;Check for a &amp;quot;.&amp;quot; - If we see one, go to step 3.1, otherwise, DO NOT ACCEPT THE &amp;quot;.&amp;quot; as code, and go to step 4        &lt;ol&gt;         &lt;li&gt;If the character AFTER the &amp;quot;.&amp;quot; is a valid identifier, accept the &amp;quot;.&amp;quot; and go back to step 1, otherwise, go to step 4 &lt;/li&gt;       &lt;/ol&gt;     &lt;/li&gt;      &lt;li&gt;Done! &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&lt;u&gt;Differentiating between code and content&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;Step 3.1 is a particularly interesting part of the above algorithm, and enables Razor to differentiate between scenarios where an identifier is being used as part of the code statement, and when it should instead be treated as static content:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_00930516.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_0DF9181C.png" width="461" height="43" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Notice how in the snippet above we have ? and ! characters at the end of our code nuggets.&amp;#160; These are both legal C# identifiers – but Razor is able to implicitly identify that they should be treated as static string content as opposed to being part of the code expression because there is whitespace after them.&amp;#160; This is pretty cool and saves us keystrokes.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Explicit Code Nuggets in Razor&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Razor is smart enough to implicitly identify a lot of code nugget scenarios.&amp;#160; But there are still times when you want/need to be more explicit in how you scope the code nugget expression.&amp;#160; The @(expression) syntax allows you to do this:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_6D71D869.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_65E668FC.png" width="298" height="41" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;You can write any C#/VB code statement you want within the @() syntax.&amp;#160; Razor will treat the wrapping () characters as the explicit scope of the code nugget statement.&amp;#160; Below are a few scenarios where we could use the explicit code nugget feature:&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Perform Arithmetic Calculation/Modification:&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;You can perform arithmetic calculations within an explicit code nugget:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_455F294A.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_52C53C50.png" width="374" height="47" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;&lt;u&gt;Appending Text to a Code Expression Result: &lt;/u&gt;&lt;/p&gt;    &lt;p&gt;You can use the explicit expression syntax to append static text at the end of a code nugget without having to worry about it being incorrectly parsed as code:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_602B4F56.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_2AB28D31.png" width="423" height="42" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Above we have embedded a code nugget within an &amp;lt;img&amp;gt; element’s src attribute.&amp;#160; It allows us to link to images with URLs like “/Images/Beverages.jpg”.&amp;#160; Without the explicit parenthesis, Razor would have looked for a “.jpg” property on the CategoryName (and raised an error).&amp;#160; By being explicit we can clearly denote where the code ends and the text begins.&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Using Generics and Lambdas&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;Explicit expressions also allow us to use generic types and generic methods within code expressions – and enable us to avoid the &amp;lt;&amp;gt; characters in generics from being ambiguous with tag elements.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;One More Thing….Intellisense within Attributes&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;We have used code nuggets within HTML attributes in several of the examples above.&amp;#160; One nice feature supported by the Razor code editor within Visual Studio is the ability to still get VB/C# intellisense when doing this.&lt;/p&gt;    &lt;p&gt;Below is an example of C# code intellisense when using an implicit code nugget within an &amp;lt;a&amp;gt; href=”” attribute:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_23271DC4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_3020FDD5.png" width="611" height="308" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Below is an example of C# code intellisense when using an explicit code nugget embedded in the middle of a &amp;lt;img&amp;gt; src=”” attribute:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_3D1ADDE6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_0E552544.png" width="570" height="235" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Notice how we are getting full code intellisense for both scenarios – despite the fact that the code expression is embedded within an HTML attribute (something the existing .aspx code editor doesn’t support).&amp;#160; This makes writing code even easier, and ensures that you can take advantage of intellisense everywhere.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Summary&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Razor enables a clean and concise templating syntax that enables a very fluid coding workflow.&amp;#160; Razor’s ability to implicitly scope code nuggets reduces the amount of typing you need to perform, and leaves you with really clean code.&lt;/p&gt;    &lt;p&gt;When necessary, you can also explicitly scope code expressions using a @(expression) syntax to provide greater clarity around your intent, as well as to disambiguate code statements from static markup.&lt;/p&gt;    &lt;p&gt;Hope this helps,&lt;/p&gt;    &lt;p&gt;Scott&lt;/p&gt;    &lt;p&gt;&lt;i&gt;P.S. In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at: &lt;/i&gt;&lt;a href="http://www.twitter.com/scottgu"&gt;twitter.com/scottgu&lt;/a&gt;&lt;/p&gt; &lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7662855" width="1" height="1"&gt;</content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term=".NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/.NET/default.aspx" />
    <category term="ASP.NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/ASP.NET/default.aspx" />
    <category term="MVC" scheme="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx" />
    <category term="Visual Studio" scheme="http://weblogs.asp.net/scottgu/archive/tags/Visual+Studio/default.aspx" />
  </entry>
  <entry>
    <title>ASP.NET MVC 3: Razor’s @: and &lt;text&gt; syntax</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/12/15/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/12/15/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax.aspx</id>
    <published>2010-12-16T07:48:39Z</published>
    <updated>2010-12-16T07:48:39Z</updated>
    <content type="html">&lt;font size="2" face="arial"&gt;   &lt;p&gt;This is another in a series of posts I’m doing that cover some of the new ASP.NET MVC 3 features:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/10/19/asp-net-mvc-3-new-model-directive-support-in-razor.aspx" target="_blank"&gt;New @model keyword in Razor (Oct 19th)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx" target="_blank"&gt;Layouts with Razor (Oct 22nd)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/11/12/asp-net-mvc-3-server-side-comments-with-razor.aspx" target="_blank"&gt;Server-Side Comments with Razor (Nov 12th)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;Razor’s @: and &amp;lt;text&amp;gt; syntax (today) &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;In today’s post I’m going to discuss two useful syntactical features of the new Razor view-engine – the @: and &amp;lt;text&amp;gt; syntax support.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Fluid Coding with Razor&lt;/u&gt;&lt;/h3&gt;    &lt;h5&gt;&lt;/h5&gt;    &lt;p&gt;ASP.NET MVC 3 ships with a new view-engine option called “Razor” (in addition to the existing .aspx view engine).&amp;#160; You can learn more about Razor, why we are introducing it, and the syntax it supports from my &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx" target="_blank"&gt;Introducing Razor&lt;/a&gt; blog post.&amp;#160; &lt;/p&gt;    &lt;p&gt;Razor minimizes the number of characters and keystrokes required when writing a view template, and enables a fast, fluid coding workflow. Unlike most template syntaxes, you do not need to interrupt your coding to explicitly denote the start and end of server blocks within your HTML. The Razor parser is smart enough to infer this from your code. This enables a compact and expressive syntax which is clean, fast and fun to type. &lt;/p&gt;    &lt;p&gt;For example, the Razor snippet below can be used to iterate a list of products:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_6D82A5EB.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_0CC54CBF.png" width="317" height="154" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;When run, it generates output like:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_40F97605.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_2B2F8DA8.png" width="358" height="284" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;One of the techniques that Razor uses to implicitly identify when a code block ends is to look for tag/element content to denote the beginning of a content region.&amp;#160; For example, in the code snippet above Razor automatically treated the inner &amp;lt;li&amp;gt;&amp;lt;/li&amp;gt; block within our foreach loop as an HTML content block because it saw the opening &amp;lt;li&amp;gt; tag sequence and knew that it couldn’t be valid C#.&amp;#160; &lt;/p&gt;    &lt;p&gt;This particular technique – using tags to identify content blocks within code – is one of the key ingredients that makes Razor so clean and productive with scenarios involving HTML creation. &lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Using @: to explicitly indicate the start of content&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Not all content container blocks start with a tag element tag, though, and there are scenarios where the Razor parser can’t &lt;em&gt;implicitly&lt;/em&gt; detect a content block.&lt;/p&gt;    &lt;p&gt;Razor addresses this by enabling you to &lt;em&gt;explicitly&lt;/em&gt; indicate the beginning of a line of content by using the @: character sequence within a code block.&amp;#160; The @: sequence indicates that the line of content that follows should be treated as a content block:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_51253DFE.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_1D7CD1A0.png" width="434" height="82" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;As a more practical example, the below snippet demonstrates how we could output a “(Out of Stock!)” message next to our product name if the product is out of stock:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_756A2280.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_5B29B95C.png" width="313" height="240" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Because I am not wrapping the (Out of Stock!) message in an HTML tag element, Razor can’t implicitly determine that the content within the @if block is the start of a content block.&amp;#160; We are using the @: character sequence to explicitly indicate that this line within our code block should be treated as content.&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Using Code Nuggets within @: content blocks&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;In addition to outputting static content, you can also have code nuggets embedded within a content block that is initiated using a @: character sequence.&amp;#160; &lt;/p&gt;    &lt;p&gt;For example, we have two @: sequences in the code snippet below:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_455FD0FF.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_395DE0CB.png" width="378" height="259" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Notice how within the second @: sequence we are emitting the number of units left within the content block (e.g. - “(Only 3 left!”). We are doing this by embedding a @p.UnitsInStock code nugget within the line of content.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Multiple Lines of Content&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Razor makes it easy to have multiple lines of content wrapped in an HTML element.&amp;#160; For example, below the inner content of our @if container is wrapped in an HTML &amp;lt;p&amp;gt; element – which will cause Razor to treat it as content: &lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_483D7C6E.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_6E332CC4.png" width="284" height="167" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;For scenarios where the multiple lines of content are not wrapped by an outer HTML element, you can use multiple @: sequences:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_51814B26.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_37AD14F7.png" width="290" height="117" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Alternatively, Razor also allows you to use a &amp;lt;text&amp;gt; element to explicitly identify content:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_6FEB8C0F.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_4EF81968.png" width="448" height="176" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;The &amp;lt;text&amp;gt; tag is an element that is treated specially by Razor. It causes Razor to interpret the inner contents of the &amp;lt;text&amp;gt; block as content, and to &lt;u&gt;not render&lt;/u&gt; the containing &amp;lt;text&amp;gt; tag element (meaning only the inner contents of the &amp;lt;text&amp;gt; element will be rendered – the tag itself will not).&amp;#160; This makes it convenient when you want to render multi-line content blocks that are not wrapped by an HTML element.&amp;#160; &lt;/p&gt;    &lt;p&gt;The &amp;lt;text&amp;gt; element can also optionally be used to denote single-lines of content, if you prefer it to the more concise @: sequence:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_7C0D0636.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_4D474D94.png" width="327" height="200" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;The above code will render the same output as the @: version we looked at earlier.&amp;#160; Razor will automatically omit the &amp;lt;text&amp;gt; wrapping element from the output and just render the content within it.&amp;#160; &lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Summary&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Razor enables a clean and concise templating syntax that enables a very fluid coding workflow.&amp;#160; Razor’s smart detection of &amp;lt;tag&amp;gt; elements to identify the beginning of content regions is one of the reasons that the Razor approach works so well with HTML generation scenarios, and it enables you to avoid having to explicitly mark the beginning/ending of content regions in about 95% of if/else and foreach scenarios. &lt;/p&gt;    &lt;p&gt;Razor’s @: and &amp;lt;text&amp;gt; syntax can then be used for scenarios where you want to avoid using an HTML element within a code container block, and need to more explicitly denote a content region.&lt;/p&gt;    &lt;p&gt;Hope this helps,&lt;/p&gt;    &lt;p&gt;Scott&lt;/p&gt;    &lt;p&gt;&lt;i&gt;P.S. In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at: &lt;/i&gt;&lt;a href="http://www.twitter.com/scottgu" target="_blank"&gt;twitter.com/scottgu&lt;/a&gt;&lt;/p&gt; &lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7662500" width="1" height="1"&gt;</content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term=".NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/.NET/default.aspx" />
    <category term="ASP.NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/ASP.NET/default.aspx" />
    <category term="MVC" scheme="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx" />
  </entry>
  <entry>
    <title>Update on ASP.NET MVC 3 RC2 (and a workaround for a bug in it)</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/12/14/update-on-asp-net-mvc-3-rc2-and-a-workaround-for-a-bug-in-it.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/12/14/update-on-asp-net-mvc-3-rc2-and-a-workaround-for-a-bug-in-it.aspx</id>
    <published>2010-12-15T00:53:55Z</published>
    <updated>2010-12-15T00:53:55Z</updated>
    <content type="html">&lt;font size="2" face="arial"&gt;   &lt;p&gt;Last week we &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/12/10/announcing-asp-net-mvc-3-release-candidate-2.aspx" target="_blank"&gt;published&lt;/a&gt; the RC2 build of ASP.NET MVC 3.&amp;#160; I blogged a bunch of details about it &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/12/10/announcing-asp-net-mvc-3-release-candidate-2.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;One of the reasons we publish release candidates is to help find those last “hard to find” bugs. So far we haven’t seen many issues reported with the RC2 release (which is good) - although we have seen a few reports of a metadata caching bug that manifests itself in at least two scenarios:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;u&gt;Nullable parameters in action methods have problems&lt;/u&gt;: When you have a controller action method with a nullable parameter (like int? – or a complex type that has a nullable sub-property), the nullable parameter might always end up being null - even when the request contains a valid value for the parameter. &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;&lt;u&gt;[AllowHtml] doesn’t allow HTML in model binding&lt;/u&gt;: When you decorate a model property with an [AllowHtml] attribute (to turn off HTML injection protection), the model binding still fails when HTML content is posted to it. &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;Both of these issues are caused by an over-eager caching optimization we introduced very late in the RC2 milestone.&amp;#160; This issue will be fixed for the final ASP.NET MVC 3 release.&amp;#160; Below is a workaround step you can implement to fix it today. &lt;/p&gt;    &lt;p&gt;&lt;u&gt;&lt;strong&gt;Workaround You Can Use Today&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;You can fix the above issues with the current ASP.NT MVC 3 RC2 release by adding one line of code to the Application_Start() event handler within the Global.asax class of your application:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_6D11DD22.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_0BE85101.png" width="645" height="194" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;The above code sets the ModelMetaDataProviders.Current property to use the DataAnnotationsModelMetadataProvider.&amp;#160; This causes ASP.NET MVC 3 to use a meta-data provider implementation that doesn’t have the more aggressive caching logic we introduced late in the RC2 release, and prevents the caching issues that cause the above issues to occur.&amp;#160; &lt;/p&gt;    &lt;p&gt;You don’t need to change any other code within your application.&amp;#160; Once you make this change the above issues are fixed.&amp;#160; You won’t need to have this line of code within your applications once the final ASP.NET MVC 3 release ships (although keeping it in also won’t cause any problems).&lt;/p&gt;    &lt;p&gt;Hope this helps – and please keep any reports of issues coming our way,&lt;/p&gt;    &lt;p&gt;Scott&lt;/p&gt;    &lt;p&gt;&lt;i&gt;P.S. In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at: &lt;/i&gt;&lt;a href="http://www.twitter.com/scottgu"&gt;twitter.com/scottgu&lt;/a&gt;&lt;/p&gt; &lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7661937" width="1" height="1"&gt;</content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term=".NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/.NET/default.aspx" />
    <category term="ASP.NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/ASP.NET/default.aspx" />
    <category term="Community News" scheme="http://weblogs.asp.net/scottgu/archive/tags/Community+News/default.aspx" />
    <category term="MVC" scheme="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx" />
  </entry>
  <entry>
    <title>Announcing ASP.NET MVC 3 (Release Candidate 2)</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/12/10/announcing-asp-net-mvc-3-release-candidate-2.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/12/10/announcing-asp-net-mvc-3-release-candidate-2.aspx</id>
    <published>2010-12-11T07:47:09Z</published>
    <updated>2010-12-11T07:47:09Z</updated>
    <content type="html">&lt;font size="2" face="arial"&gt;   &lt;p&gt;Earlier today the ASP.NET team shipped the final release candidate (RC2) for ASP.NET MVC 3.&amp;#160; You can download and install it &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=955d593e-cbd1-4ed1-88eb-02ff79dd74d8&amp;amp;displaylang=en" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Almost there…&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Today’s RC2 release is the near-final release of ASP.NET MVC 3, and is a true “release candidate” in that we are hoping to not make any more code changes with it.&amp;#160; We are publishing it today so that people can do final testing with it, let us know if they find any last minute “showstoppers”, and start updating their apps to use it.&amp;#160; We will officially ship the final ASP.NET MVC 3 “RTM” build in January.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Works with both VS 2010 and VS 2010 SP1 Beta&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Today’s ASP.NET MVC 3 RC2 release works with both the shipping version of Visual Studio 2010 / Visual Web Developer 2010 Express, as well as the newly released &lt;a href="http://www.hanselman.com/blog/VisualStudioExplosionVS2010SP1BETAReleasedAndContext.aspx" target="_blank"&gt;VS 2010 SP1 Beta&lt;/a&gt;.&amp;#160; &lt;/p&gt;    &lt;p&gt;This means that you &lt;u&gt;do not &lt;/u&gt;need to install VS 2010 SP1 (or the SP1 beta) in order to use ASP.NET MVC 3.&amp;#160; It works just fine with the shipping Visual Studio 2010.&amp;#160; I’ll do a blog post next week, though, about some of the nice additional feature goodies that come with VS 2010 SP1 (including IIS Express and SQL CE support within VS) which make the dev experience for both ASP.NET Web Forms and ASP.NET MVC even better.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Bugs and Perf Fixes&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Today’s ASP.NET MVC 3 RC2 build contains many bug fixes and performance optimizations.&amp;#160; Our latest performance tests indicate that ASP.NET MVC 3 is now faster than ASP.NET MVC 2, and that existing ASP.NET MVC applications will experience a slight performance increase when updated to run using ASP.NET MVC 3.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Final Tweaks and Fit-N-Finish&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;In addition to bug fixes and performance optimizations, today’s RC2 build contains a number of last-minute feature tweaks and “fit-n-finish” changes for the new ASP.NET MVC 3 features.&amp;#160; The feedback and suggestions we’ve received during the public previews has been invaluable in guiding these final tweaks, and we really appreciate people’s support in sending this feedback our way.&amp;#160; &lt;/p&gt;    &lt;p&gt;Below is a short-list of some of the feature changes/tweaks made between last month’s ASP.NET MVC 3 RC release and today’s ASP.NET MVC 3 RC2 release:&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;u&gt;jQuery updates and addition of jQuery UI&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;The default ASP.NET MVC 3 project templates have been updated to include jQuery 1.4.4 and jQuery Validation 1.7.&amp;#160; &lt;/p&gt;    &lt;p&gt;We are also excited to announce today that we are including jQuery UI within our default ASP.NET project templates going forward.&amp;#160; jQuery UI provides a powerful set of additional UI widgets and capabilities.&amp;#160; It will be added by default to your project’s \scripts folder when you create new ASP.NET MVC 3 projects.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;u&gt;Improved View Scaffolding&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;The T4 templates used for scaffolding views with the Add-View dialog now generates views that use &lt;em&gt;Html.EditorFor &lt;/em&gt;instead of helpers such as &lt;em&gt;Html.TextBoxFor&lt;/em&gt;. This change enables you to optionally annotate models with metadata (using data annotation attributes) to better customize the output of your UI at runtime. &lt;/p&gt;    &lt;p&gt;The Add View scaffolding also supports improved detection and usage of primary key information on models (including support for naming conventions like ID, ProductID, etc).&amp;#160; For example: the Add View dialog box uses this information to ensure that the primary key value is not scaffold as an editable form field, and that links between views are auto-generated correctly with primary key information.&lt;/p&gt;    &lt;p&gt;The default Edit and Create templates also now include references to the jQuery scripts needed for client validation.&amp;#160; Scaffold form views now support client-side validation by default (no extra steps required).&amp;#160; Client-side validation with ASP.NET MVC 3 is also done using an unobtrusive javascript approach – making pages fast and clean.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;u&gt;[ControllerSessionState] –&amp;gt; [SessionState]&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;ASP.NET MVC 3 adds support for session-less controllers.&amp;#160; With the initial RC you used a [ControllerSessionState] attribute to specify this.&amp;#160; We shortened this in RC2 to just be [SessionState]:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_5DB3F0B7.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_43738793.png" width="376" height="110" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Note that in addition to turning off session state, you can also set it to be read-only (which is useful for webfarm scenarios where you are reading but not updating session state on a particular request).&lt;/p&gt;    &lt;p&gt;&lt;u&gt;&lt;strong&gt;[SkipRequestValidation] –&amp;gt; [AllowHtml]&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;ASP.NET MVC includes built-in support to protect against HTML and Cross-Site Script Injection Attacks, and will throw an error by default if someone tries to post HTML content as input.&amp;#160; Developers need to explicitly indicate that this is allowed (and that they’ve hopefully built their app to securely support it) in order to enable it.&lt;/p&gt;    &lt;p&gt;With ASP.NET MVC 3, we are also now supporting a new attribute that you can apply to properties of models/viewmodels to indicate that HTML input is enabled, which enables much more granular protection in a DRY way.&amp;#160; In last month’s RC release this attribute was named [SkipRequestValidation].&amp;#160; With RC2 we renamed it to [AllowHtml] to make it more intuitive:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_4DC4ABF3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_2CD1394C.png" width="352" height="179" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Setting the above [AllowHtml] attribute on a model/viewmodel will cause ASP.NET MVC 3 to turn off HTML injection protection when model binding just that property.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;u&gt;Html.Raw() helper method&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;The new Razor view engine introduced with ASP.NET MVC 3 automatically HTML encodes output by default.&amp;#160; This helps provide an additional level of protection against HTML and Script injection attacks.&lt;/p&gt;    &lt;p&gt;With RC2 we are adding a Html.Raw() helper method that you can use to explicitly indicate that you do not want to HTML encode your output, and instead want to render the content “as-is”:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_52C6E9A2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_46C4F96E.png" width="472" height="293" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;&lt;u&gt;&lt;strong&gt;ViewModel/View –&amp;gt; ViewBag&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;ASP.NET MVC has (since V1) supported a ViewData[] dictionary within Controllers and Views that enables developers to pass information from a Controller to a View in a late-bound way.&amp;#160; This approach can be used instead of, or in combination with, a strongly-typed model class.&amp;#160; The below code demonstrates a common use case – where a strongly typed Product model is passed to the view in addition to two late-bound variables via the ViewData[] dictionary:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_45EC9384.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_3022AB27.png" width="611" height="225" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;With ASP.NET MVC 3 we are introducing a new API that takes advantage of the dynamic type support within .NET 4 to set/retrieve these values.&amp;#160; It allows you to use standard “dot” notation to specify any number of additional variables to be passed, and does not require that you create a strongly-typed class to do so.&amp;#160; &lt;/p&gt;    &lt;p&gt;With earlier previews of ASP.NET MVC 3 we exposed this API using a dynamic property called “ViewModel” on the Controller base class, and with a dynamic property called “View” within view templates.&amp;#160; A lot of people found the fact that there were two different names confusing, and several also said that using the name ViewModel was confusing in this context – since often you create strongly-typed ViewModel classes in ASP.NET MVC, and they do not use this API.&amp;#160; &lt;/p&gt;    &lt;p&gt;With RC2 we are exposing a dynamic property that has the same name – ViewBag – within both Controllers and Views.&amp;#160; It is a dynamic collection that allows you to pass additional bits of data from your controller to your view template to help generate a response.&amp;#160; Below is an example of how we could use it to pass a time-stamp message as well as a list of all categories to our view template:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_48461582.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_23485509.png" width="597" height="224" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Below is an example of how our view template (which is strongly-typed to expect a Product class as its model) can use the two extra bits of information we passed in our ViewBag to generate the response.&amp;#160; In particular, notice how we are using the list of categories passed in the dynamic ViewBag collection to generate a dropdownlist of friendly category names to help set the CategoryID property of our Product object.&amp;#160; &lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_226FEF1F.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_0C39D3CD.png" width="763" height="761" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;The above Controller/View combination will then generate an HTML response like below.&amp;#160; &lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_4001CA1E.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_29CBAECC.png" width="618" height="664" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;u&gt;Output Caching Improvements&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;ASP.NET MVC 3’s output caching system no longer requires you to specify a VaryByParam property when declaring an [OutputCache] attribute on a Controller action method.&amp;#160; MVC3 now automatically varies the output cached entries when you have explicit parameters on your action method – allowing you to cleanly enable output caching on actions using code like below:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_48A222AA.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_7CD64BF0.png" width="362" height="134" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;In addition to supporting full page output caching, ASP.NET MVC 3 also supports partial-page caching – which allows you to cache a region of output and re-use it across multiple requests or controllers.&amp;#160; The [OutputCache] behavior for partial-page caching was updated with RC2 so that sub-content cached entries are varied based on input parameters as opposed to the URL structure of the top-level request – which makes caching scenarios both easier and more powerful than the behavior in the previous RC.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;u&gt;@model declaration does not add whitespace&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;In earlier previews, the strongly-typed &lt;em&gt;@model&lt;/em&gt; declaration at the top of a Razor view added a blank line to the rendered HTML output. This has been fixed so that the declaration does not introduce whitespace.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;u&gt;Changed &amp;quot;Html.ValidationMessage&amp;quot; Method to Display the First Useful Error Message&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;The behavior of the &lt;em&gt;Html.ValidationMessage()&lt;/em&gt; helper was updated to show the first useful error message instead of simply displaying the first error. &lt;/p&gt;    &lt;p&gt;During model binding, the &lt;em&gt;ModelState&lt;/em&gt; dictionary can be populated from multiple sources with error messages about the property, including from the model itself (if it implements &lt;em&gt;IValidatableObject&lt;/em&gt;), from validation attributes applied to the property, and from exceptions thrown while the property is being accessed. &lt;/p&gt;    &lt;p&gt;When the &lt;em&gt;Html.ValidationMessage()&lt;/em&gt; method displays a validation message, it now skips model-state entries that include an exception, because these are generally not intended for the end user. Instead, the method looks for the first validation message that is not associated with an exception and displays that message. If no such message is found, it defaults to a generic error message that is associated with the first exception.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;u&gt;RemoteAttribute “Fields” -&amp;gt; “AdditionalFields” &lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;ASP.NET MVC 3 includes built-in remote validation support with its validation infrastructure.&amp;#160; This means that the client-side validation script library used by ASP.NET MVC 3 can automatically call back to controllers you expose on the server to determine whether an input element is indeed valid as the user is editing the form (allowing you to provide real-time validation updates).&lt;/p&gt;    &lt;p&gt;You can accomplish this by decorating a model/viewmodel property with a [Remote] attribute that specifies the controller/action that should be invoked to remotely validate it.&amp;#160; With the RC this attribute had a “Fields” property that could be used to specify additional input elements that should be sent from the client to the server to help with the validation logic.&amp;#160; To improve the clarity of what this property does we have renamed it to “AdditionalFields” with today’s RC2 release. &lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;u&gt;ViewResult.Model and ViewResult.ViewBag Properties&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;The ViewResult class now exposes both a “Model” and “ViewBag” property off of it.&amp;#160; This makes it easier to unit test Controllers that return views, and avoids you having to access the Model via the ViewResult.ViewData.Model property.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Installation Notes&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;You can download and install the ASP.NET MVC 3 RC2 build &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=955d593e-cbd1-4ed1-88eb-02ff79dd74d8&amp;amp;displaylang=en" target="_blank"&gt;here&lt;/a&gt;.&amp;#160; It can be installed on top of the previous ASP.NET MVC 3 RC release (it should just replace the bits as part of its setup).&lt;/p&gt;    &lt;p&gt;The one component that will not be updated by the above setup (if you already have it installed) is the NuGet Package Manager.&amp;#160; If you already have NuGet installed, please go to the Visual Studio Extensions Manager (via the Tools –&amp;gt; Extensions menu option) and click on the “Updates” tab.&amp;#160; You should see NuGet listed there – please click the “Update” button next to it to have VS update the extension to today’s release.&lt;/p&gt;    &lt;p&gt;If you do not have NuGet installed (and did not install the ASP.NET MVC RC build), then NuGet will be installed as part of your ASP.NET MVC 3 setup, and you do not need to take any additional steps to make it work.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Summary&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;We are really close to the final ASP.NET MVC 3 release, and will deliver the final “RTM” build of it next month.&amp;#160; It has been only a little over 7 months since ASP.NET MVC 2 shipped, and I’m pretty amazed by the huge number of new features, improvements, and refinements that the team has been able to add with this release (Razor, Unobtrusive JavaScript, NuGet, Dependency Injection, Output Caching, and a lot, lot more).&amp;#160; I’ll be doing a number of blog posts over the next few weeks talking about many of them in more depth.&lt;/p&gt;    &lt;p&gt;Hope this helps,&lt;/p&gt;    &lt;p&gt;Scott&lt;/p&gt;    &lt;p&gt;&lt;i&gt;P.S. In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at: &lt;/i&gt;&lt;a href="http://www.twitter.com/scottgu"&gt;twitter.com/scottgu&lt;/a&gt;&lt;/p&gt; &lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7659821" width="1" height="1"&gt;</content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term=".NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/.NET/default.aspx" />
    <category term="ASP.NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/ASP.NET/default.aspx" />
    <category term="Community News" scheme="http://weblogs.asp.net/scottgu/archive/tags/Community+News/default.aspx" />
    <category term="MVC" scheme="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx" />
  </entry>
  <entry>
    <title>Class-Level Model Validation with EF Code First and ASP.NET MVC 3</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/12/10/class-level-model-validation-with-ef-code-first-and-asp-net-mvc-3.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/12/10/class-level-model-validation-with-ef-code-first-and-asp-net-mvc-3.aspx</id>
    <published>2010-12-10T09:05:45Z</published>
    <updated>2010-12-10T09:05:45Z</updated>
    <content type="html">&lt;font size="2" face="arial"&gt;   &lt;p&gt;Earlier this week the data team &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/12/08/announcing-entity-framework-code-first-ctp5-release.aspx" target="_blank"&gt;released the CTP5 build&lt;/a&gt; of the new Entity Framework Code-First library.&amp;#160; &lt;/p&gt;    &lt;p&gt;In my &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/12/08/announcing-entity-framework-code-first-ctp5-release.aspx" target="_blank"&gt;blog post&lt;/a&gt; a few days ago I talked about a few of the improvements introduced with the new CTP5 build.&amp;#160; Automatic support for enforcing DataAnnotation validation attributes on models was one of the improvements I discussed.&amp;#160; It provides a pretty easy way to enable property-level validation logic within your model layer.&lt;/p&gt;    &lt;p&gt;You can apply validation attributes like [Required], [Range], and [RegularExpression] – all of which are built-into .NET 4 – to your model classes in order to enforce that the model properties are valid before they are persisted to a database.&amp;#160; You can also create your own custom validation attributes (like this cool &lt;a href="http://benjii.me/2010/11/credit-card-validator-attribute-for-asp-net-mvc-3/" target="_blank"&gt;[CreditCard] validator&lt;/a&gt;) and have them be automatically enforced by EF Code First as well.&amp;#160; This provides a really easy way to validate property values on your models.&amp;#160; I showed some code samples of this in action in my &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/12/08/announcing-entity-framework-code-first-ctp5-release.aspx" target="_blank"&gt;previous post&lt;/a&gt;.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Class-Level Model Validation using IValidatableObject&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;DataAnnotation attributes provides an easy way to validate individual property values on your model classes.&amp;#160; &lt;/p&gt;    &lt;p&gt;Several people have asked - “Does EF Code First also support a way to implement &lt;em&gt;class-level&lt;/em&gt; validation methods on model objects, for validation rules than need to &lt;em&gt;span multiple property values&lt;/em&gt;?”&amp;#160; It does – and one easy way you can enable this is by implementing the IValidatableObject interface on your model classes.&lt;/p&gt;    &lt;p&gt;&lt;u&gt;IValidatableObject.Validate() Method&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;Below is an example of using the IValidatableObject interface (which is built-into .NET 4 within the System.ComponentModel.DataAnnotations namespace) to implement two custom validation rules on a Product model class.&amp;#160; The two rules ensure that:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;New units can’t be ordered if the Product is in a discontinued state &lt;/li&gt;      &lt;li&gt;New units can’t be ordered if there are already more than 100 units in stock &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;We will enforce these business rules by implementing the IValidatableObject interface on our Product class, and by implementing its Validate() method like so:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_3D493906.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_223069F8.png" width="808" height="399" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;The IValidatableObject.Validate() method can apply validation rules that span across multiple properties, and can yield back multiple validation errors. Each ValidationResult returned can supply both an error message as well as an &lt;em&gt;optional&lt;/em&gt;&amp;#160;&lt;em&gt;list&lt;/em&gt; of property names that caused the violation (which is useful when displaying error messages within UI).&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Automatic Validation Enforcement&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;EF Code-First (starting with CTP5) now automatically invokes the Validate() method when a model object that implements the IValidatableObject interface is saved.&amp;#160; You &lt;u&gt;do not&lt;/u&gt; need to write any code to cause this to happen – this support is now enabled by default. &lt;/p&gt;    &lt;p&gt;This new support means that the below code – which violates one of our above business rules – will automatically throw an exception (and abort the transaction) when we call the “SaveChanges()” method on our Northwind DbContext:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_0BFA4EA6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_6A9AA909.png" width="489" height="204" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;In addition to reactively handling validation exceptions, EF Code First also allows you to proactively check for validation errors.&amp;#160; Starting with CTP5, you can call the “GetValidationErrors()” method on the DbContext base class to retrieve a list of validation errors within the model objects you are working with.&amp;#160; GetValidationErrors() will return a list of all validation errors – regardless of whether they are generated via DataAnnotation attributes or by an IValidatableObject.Validate() implementation.&amp;#160; &lt;/p&gt;    &lt;p&gt;Below is an example of proactively using the GetValidationErrors() method to check (and handle) errors before trying to call SaveChanges():&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_5E2C85E0.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_764FF03B.png" width="390" height="292" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;h3&gt;&lt;u&gt;ASP.NET MVC 3 and IValidatableObject&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;ASP.NET MVC 2 included support for automatically honoring and enforcing DataAnnotation attributes on model objects that are used with ASP.NET MVC’s model binding infrastructure.&amp;#160; ASP.NET MVC 3 goes further and also honors the IValidatableObject interface.&amp;#160; This combined support for model validation makes it easy to display appropriate error messages within forms when validation errors occur.&amp;#160; &lt;/p&gt;    &lt;p&gt;To see this in action, let’s consider a simple Create form that allows users to create a new Product:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_608607DE.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_7F5C7BBC.png" width="612" height="695" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;We can implement the above Create functionality using a ProductsController class that has two “Create” action methods like below:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_05371F56.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_38FF15A7.png" width="433" height="545" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;The first Create() method implements a version of the /Products/Create URL that handles HTTP-GET requests - and displays the HTML form to fill-out.&amp;#160; The second Create() method implements a version of the /Products/Create URL that handles HTTP-POST requests - and which takes the posted form data, ensures that is is valid, and if it is valid saves it in the database.&amp;#160; If there are validation issues it redisplays the form with the posted values.&amp;#160; &lt;/p&gt;    &lt;p&gt;The razor view template of our “Create” view (which renders the form) looks like below:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_77F09642.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_0FA7CDA9.png" width="583" height="912" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;One of the nice things about the above Controller + View implementation is that &lt;u&gt;we did not write any validation logic within it&lt;/u&gt;.&amp;#160; The validation logic and business rules are instead implemented entirely within our model layer, and the ProductsController simply checks whether it is valid (by calling the ModelState.IsValid helper method) to determine whether to try and save the changes or redisplay the form with errors. The Html.ValidationMessageFor() helper method calls within our view simply display the error messages our Product model’s DataAnnotations and IValidatableObject.Validate() method returned.&amp;#160; &lt;/p&gt;    &lt;p&gt;We can see the above scenario in action by filling out invalid data within the form and attempting to submit it:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_15827142.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_2D39A8A8.png" width="647" height="703" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Notice above how when we hit the “Create” button we got an error message.&amp;#160; This was because we ticked the “Discontinued” checkbox while also entering a value for the UnitsOnOrder (and so violated one of our business rules).&amp;#160; &lt;/p&gt;    &lt;p&gt;You might ask – how did ASP.NET MVC know to highlight and display the error message next to the UnitsOnOrder textbox?&amp;#160; It did this because ASP.NET MVC 3 now honors the IValidatableObject interface when performing model binding, and will retrieve the error messages from validation failures with it.&lt;/p&gt;    &lt;p&gt;The business rule within our Product model class indicated that the “UnitsOnOrder” property should be highlighted when the business rule we hit was violated: &lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_4C101C86.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_6AE69064.png" width="814" height="166" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Our Html.ValidationMessageFor() helper method knew to display the business rule error message (next to the UnitsOnOrder edit box) because of the above property name hint we supplied:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_0309FAC0.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_73F31BE5.png" width="490" height="149" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Keeping things DRY&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;ASP.NET MVC and EF Code First enables you to keep your validation and business rules in one place (within your model layer), and avoid having it creep into your Controllers and Views.&amp;#160; &lt;/p&gt;    &lt;p&gt;Keeping the validation logic in the model layer helps ensure that you do not duplicate validation/business logic as you add more Controllers and Views to your application.&amp;#160; It allows you to quickly change your business rules/validation logic in one single place (within your model layer) – and have all controllers/views across your application immediately reflect it.&amp;#160; This help keep your application code clean and easily maintainable, and makes it much easier to evolve and update your application in the future.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Summary&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;EF Code First (starting with CTP5) now has built-in support for both DataAnnotations and the IValidatableObject interface.&amp;#160; This allows you to easily add validation and business rules to your models, and have EF automatically ensure that they are enforced anytime someone tries to persist changes of them to a database.&amp;#160; &lt;/p&gt;    &lt;p&gt;ASP.NET MVC 3 also now supports both DataAnnotations and IValidatableObject as well, which makes it even easier to use them with your EF Code First model layer – and then have the controllers/views within your web layer automatically honor and support them as well.&amp;#160; This makes it easy to build clean and highly maintainable applications.&lt;/p&gt;    &lt;p&gt;You don’t have to use DataAnnotations or IValidatableObject to perform your validation/business logic.&amp;#160; You can always roll your own custom validation architecture and/or use other more advanced validation frameworks/patterns if you want.&amp;#160; But for a lot of applications this built-in support will probably be sufficient – and provide a highly productive way to build solutions.&lt;/p&gt;    &lt;p&gt;Hope this helps,&lt;/p&gt;    &lt;p&gt;Scott&lt;/p&gt;    &lt;p&gt;&lt;em&gt;P.S.&lt;/em&gt; &lt;em&gt;In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at: &lt;a href="http://twitter.com/scottgu" target="_blank"&gt;twitter.com/scottgu&lt;/a&gt;&lt;/em&gt;&lt;/p&gt; &lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7659102" width="1" height="1"&gt;</content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term=".NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/.NET/default.aspx" />
    <category term="ASP.NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/ASP.NET/default.aspx" />
    <category term="LINQ" scheme="http://weblogs.asp.net/scottgu/archive/tags/LINQ/default.aspx" />
    <category term="MVC" scheme="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx" />
  </entry>
  <entry>
    <title>Announcing Entity Framework Code-First (CTP5 release)</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/12/08/announcing-entity-framework-code-first-ctp5-release.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/12/08/announcing-entity-framework-code-first-ctp5-release.aspx</id>
    <published>2010-12-08T09:39:57Z</published>
    <updated>2010-12-08T09:39:57Z</updated>
    <content type="html">
      &lt;font size="2" face="arial"&gt;   &lt;p&gt;This week the data team &lt;a href="http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-released.aspx" target="_blank"&gt;released the CTP5 build&lt;/a&gt; of the new Entity Framework Code-First library.&amp;#160; EF Code-First enables a pretty sweet &lt;em&gt;code-centric&lt;/em&gt; development workflow for working with data.&amp;#160; It enables you to:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;Develop without ever having to open a designer or define an XML mapping file &lt;/li&gt;      &lt;li&gt;Define model objects by simply writing “plain old classes” with no base classes required &lt;/li&gt;      &lt;li&gt;Use a “convention over configuration” approach that enables database persistence without explicitly configuring anything &lt;/li&gt;      &lt;li&gt;Optionally override the convention-based persistence and use a fluent code API to fully customize the persistence mapping &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;I’m a big fan of the EF Code-First approach, and wrote several blog posts about it this summer:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx" target="_blank"&gt;Code-First Development with Entity Framework 4&lt;/a&gt; (July 16th) &lt;/li&gt;      &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/23/entity-framework-4-code-first-custom-database-schema-mapping.aspx" target="_blank"&gt;EF Code-First: Custom Database Schema Mapping&lt;/a&gt; (July 23rd) &lt;/li&gt;      &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx" target="_blank"&gt;Using EF Code-First with an Existing Database&lt;/a&gt; (August 3rd) &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;Today’s new CTP5 release delivers several nice improvements over the CTP4 build, and will be the last preview build of Code First before the final release of it.&amp;#160; We will ship the final EF Code First release in the first quarter of next year (Q1 of 2011).&amp;#160; It works with all .NET application types (including both ASP.NET Web Forms and ASP.NET MVC projects).&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Installing EF Code First&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;You can install and use EF Code First CTP5 using one of two ways:&lt;/p&gt;    &lt;p&gt;Approach 1) By &lt;a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=35adb688-f8a7-4d28-86b1-b6235385389d" target="_blank"&gt;downloading and running a setup program&lt;/a&gt;.&amp;#160; Once installed you can reference the EntityFramework.dll assembly it provides within your projects.&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; or&lt;/em&gt;:&lt;/p&gt;    &lt;p&gt;Approach 2) By using the &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/11/09/announcing-the-asp-net-mvc-3-release-candidate.aspx" target="_blank"&gt;NuGet Package Manager&lt;/a&gt; within Visual Studio to download and install EF Code First within a project.&amp;#160; To do this, simply bring up the NuGet Package Manager Console within Visual Studio (View-&amp;gt;Other Windows-&amp;gt;Package Manager Console) and type “Install-Package EFCodeFirst”:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_09F3925B.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_564B25FC.png" width="682" height="156" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Typing “Install-Package EFCodeFirst” within the Package Manager Console will cause NuGet to download the EF Code First package, and add it to your current project:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_3C76EFCD.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_5B4D63AB.png" width="685" height="160" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Doing this will automatically add a reference to the EntityFramework.dll assembly to your project:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_45837B4E.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_7F92482D.png" width="257" height="267" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;NuGet enables you to have EF Code First setup and ready to use within seconds.&amp;#160; When the final release of EF Code First ships you’ll also be able to just type “Update-Package EFCodeFirst” to update your existing projects to use the final release.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;EF Code First Assembly and Namespace&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;The CTP5 release of EF Code First has an updated assembly name, and new .NET namespace:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;Assembly Name: &lt;strong&gt;EntityFramework.dll&lt;/strong&gt; &lt;/li&gt;      &lt;li&gt;Namespace: &lt;strong&gt;System.Data.Entity&lt;/strong&gt; &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;These names match what we plan to use for the final release of the library.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Nice New CTP5 Improvements&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;The new CTP5 release of EF Code First contains a bunch of nice improvements and refinements. Some of the highlights include:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;Better support for Existing Databases &lt;/li&gt;      &lt;li&gt;Built-in Model-Level Validation and DataAnnotation Support &lt;/li&gt;      &lt;li&gt;Fluent API Improvements &lt;/li&gt;      &lt;li&gt;Pluggable Conventions Support &lt;/li&gt;      &lt;li&gt;New Change Tracking API &lt;/li&gt;      &lt;li&gt;Improved Concurrency Conflict Resolution &lt;/li&gt;      &lt;li&gt;Raw SQL Query/Command Support &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;The rest of this blog post contains some more details about a few of the above changes.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Better Support for Existing Databases&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;EF Code First makes it really easy to create model layers that work against existing databases.&amp;#160; CTP5 includes some refinements that further streamline the developer workflow for this scenario.&lt;/p&gt;    &lt;p&gt;Below are the steps to use EF Code First to create a model layer for the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&amp;amp;displaylang=en" target="_blank"&gt;Northwind sample database&lt;/a&gt;:&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Step 1: Create Model Classes and a DbContext class&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;Below is all of the code necessary to implement a simple model layer using EF Code First that goes against the Northwind database:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_368C2667.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_20560B15.png" width="499" height="542" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;EF Code First enables you to use “POCO” – Plain Old CLR Objects – to represent entities within a database.&amp;#160; This means that you &lt;u&gt;do not&lt;/u&gt; need to derive model classes from a base class, nor implement any interfaces or data persistence attributes on them.&amp;#160; This enables the model classes to be kept clean, easily testable, and “persistence ignorant”.&amp;#160; The Product and Category classes above are examples of POCO model classes.&lt;/p&gt;    &lt;p&gt;EF Code First enables you to easily connect your POCO model classes to a database by creating a “DbContext” class that exposes public properties that map to the tables within a database.&amp;#160; The Northwind class above illustrates how this can be done.&amp;#160; It is mapping our Product and Category classes to the “Products” and “Categories” tables within the database.&amp;#160; The properties within the Product and Category classes in turn map to the columns within the Products and Categories tables – and each instance of a Product/Category object maps to a row within the tables.&lt;/p&gt;    &lt;p&gt;The above code is all of the code required to create our model and data access layer!&amp;#160; Previous CTPs of EF Code First required an additional step to work against existing databases (a call to Database.Initializer&amp;lt;Northwind&amp;gt;(null) to tell EF Code First to not create the database) – this step is no longer required with the CTP5 release.&amp;#160; &lt;/p&gt;    &lt;p&gt;&lt;u&gt;Step 2: Configure the Database Connection String&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;We’ve written all of the code we need to write to define our model layer.&amp;#160; Our last step before we use it will be to setup a connection-string that connects it with our database.&amp;#160; To do this we’ll add a “Northwind” connection-string to our web.config file (or App.Config for client apps) like so:&lt;/p&gt;   &lt;font size="3"&gt;     &lt;pre&gt;&amp;#160; &amp;lt;connectionStrings&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add name=&amp;quot;Northwind&amp;quot; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; connectionString=&amp;quot;data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\northwind.mdf;User Instance=true&amp;quot; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; providerName=&amp;quot;System.Data.SqlClient&amp;quot; /&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;#160; &amp;lt;/connectionStrings&amp;gt;&lt;/pre&gt;
      &lt;/font&gt;

      &lt;p&gt;EF “code first” uses a convention where DbContext classes by default look for a connection-string that has the same name as the context class.&amp;#160; Because our DbContext class is called “Northwind” it by default looks for a “Northwind” connection-string to use.&amp;#160; Above our Northwind connection-string is configured to use a local SQL Express database (stored within the \App_Data directory of our project).&amp;#160; You can alternatively point it at a remote SQL Server.&lt;/p&gt;

      &lt;p&gt;&lt;u&gt;Step 3: Using our Northwind Model Layer&lt;/u&gt;&lt;/p&gt;

      &lt;p&gt;We can now easily query and update our database using the strongly-typed model layer we just built with EF Code First.&lt;/p&gt;

      &lt;p&gt;The code example below demonstrates how to use LINQ to query for products within a specific product category.&amp;#160; This query returns back a sequence of strongly-typed Product objects that match the search criteria:&lt;/p&gt;

      &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_5B3D3DDE.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_4C9291F9.png" width="459" height="101" /&gt;&lt;/a&gt; &lt;/p&gt;

      &lt;p&gt;The code example below demonstrates how we can retrieve a specific Product object, update two of its properties, and then save the changes back to the database:&lt;/p&gt;

      &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_52D96887.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_31E5F5E0.png" width="376" height="205" /&gt;&lt;/a&gt; &lt;/p&gt;

      &lt;p&gt;EF Code First handles all of the change-tracking and data persistence work for us, and allows us to focus on our application and business logic as opposed to having to worry about data access plumbing. &lt;/p&gt;

      &lt;h3&gt;&lt;u&gt;Built-in Model Validation&lt;/u&gt;&lt;/h3&gt;

      &lt;p&gt;EF Code First allows you to use any validation approach you want when implementing business rules with your model layer.&amp;#160; This enables a great deal of flexibility and power.&lt;/p&gt;

      &lt;p&gt;Starting with this week’s CTP5 release, EF Code First also now includes built-in support for both the DataAnnotation and IValidatorObject validation support built-into .NET 4.&amp;#160; This enables you to easily implement validation rules on your models, and have these rules automatically be enforced by EF Code First whenever you save your model layer.&amp;#160; It provides a very convenient “out of the box” way to enable validation within your applications.&lt;/p&gt;

      &lt;p&gt;&lt;u&gt;Applying DataAnnotations to our Northwind Model&lt;/u&gt;&lt;/p&gt;

      &lt;p&gt;The code example below demonstrates how we could add some declarative validation rules to two of the properties of our “Product” model:&lt;/p&gt;

      &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_310D8FF6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_30352A0C.png" width="506" height="273" /&gt;&lt;/a&gt; &lt;/p&gt;

      &lt;p&gt;We are using the [Required] and [Range] attributes above.&amp;#160; These validation attributes live within the System.ComponentModel.DataAnnotations namespace that is built-into .NET 4, and can be used independently of EF.&amp;#160; The error messages specified on them can either be explicitly defined (like above) – or retrieved from resource files (which makes localizing applications easy).&lt;/p&gt;

      &lt;p&gt;&lt;u&gt;Validation Enforcement on SaveChanges()&lt;/u&gt;&lt;/p&gt;

      &lt;p&gt;EF Code-First (starting with CTP5) now automatically applies and enforces DataAnnotation rules when a model object is updated or saved.&amp;#160; You &lt;u&gt;do not&lt;/u&gt; need to write any code to enforce this – this support is now enabled by default.&amp;#160; &lt;/p&gt;

      &lt;p&gt;This new support means that the below code – which violates our above rules – will automatically throw an exception when we call the “SaveChanges()” method on our Northwind DbContext:&lt;/p&gt;

      &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_48589467.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_1992DBC5.png" width="495" height="178" /&gt;&lt;/a&gt; &lt;/p&gt;

      &lt;p&gt;The &lt;em&gt;DbEntityValidationException&lt;/em&gt; that is raised when the SaveChanges() method is invoked contains a “EntityValidationErrors” property that you can use to retrieve the list of all validation errors that occurred when the model was trying to save.&amp;#160; This enables you to easily guide the user on how to fix them.&amp;#160; Note that EF Code-First will abort the entire transaction of changes if a validation rule is violated – ensuring that our database is always kept in a valid, consistent state.&lt;/p&gt;

      &lt;p&gt;EF Code First’s validation enforcement works both for the built-in .NET DataAnnotation attributes (like Required, Range, RegularExpression, StringLength, etc), as well as for any custom validation rule you create by sub-classing the &lt;em&gt;System.ComponentModel.DataAnnotations.ValidationAttribute&lt;/em&gt; base class.&lt;/p&gt;

      &lt;p&gt;&lt;u&gt;UI Validation Support&lt;/u&gt;&lt;/p&gt;

      &lt;p&gt;A lot of our UI frameworks in .NET also provide support for DataAnnotation-based validation rules. For example, ASP.NET MVC, ASP.NET Dynamic Data, and Silverlight (via WCF RIA Services) all provide support for displaying client-side validation UI that honor the DataAnnotation rules applied to model objects.&lt;/p&gt;

      &lt;p&gt;The screen-shot below demonstrates how using the default “Add-View” scaffold template within an ASP.NET MVC 3 application will cause appropriate validation error messages to be displayed if appropriate values are not provided:&lt;/p&gt;

      &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_3F888C1B.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_3E43F33C.png" width="621" height="603" /&gt;&lt;/a&gt; &lt;/p&gt;

      &lt;p&gt;ASP.NET MVC 3 supports both client-side and server-side enforcement of these validation rules.&amp;#160; The error messages displayed are automatically picked up from the declarative validation attributes – eliminating the need for you to write any custom code to display them.&lt;/p&gt;

      &lt;p&gt;&lt;u&gt;Keeping things DRY&lt;/u&gt;&lt;/p&gt;

      &lt;p&gt;The “DRY Principle” stands for “Do Not Repeat Yourself”, and is a best practice that recommends that you avoid duplicating logic/configuration/code in multiple places across your application, and instead specify it only once and have it apply everywhere.&lt;/p&gt;

      &lt;p&gt;EF Code First CTP5 now enables you to apply declarative DataAnnotation validations on your model classes (and specify them &lt;u&gt;only once)&lt;/u&gt; and then have the validation logic be enforced (and corresponding error messages displayed) across all applications scenarios – including within controllers, views, client-side scripts, and for any custom code that updates and manipulates model classes.&lt;/p&gt;

      &lt;p&gt;This makes it much easier to build good applications with clean code, and to build applications that can rapidly iterate and evolve.&lt;/p&gt;

      &lt;h3&gt;&lt;u&gt;Other EF Code First Improvements New to CTP5 &lt;/u&gt;&lt;/h3&gt;

      &lt;p&gt;EF Code First CTP5 includes a bunch of other improvements as well.&amp;#160; Below are a few short descriptions of some of them:&lt;/p&gt;

      &lt;ul&gt;
      &lt;li&gt;&lt;u&gt;Fluent API Improvements &lt;/u&gt;&lt;/li&gt;
      &lt;/ul&gt;

      &lt;p&gt;EF Code First allows you to override an “OnModelCreating()” method on the DbContext class to further refine/override the schema mapping rules used to map model classes to underlying database schema.&amp;#160; CTP5 includes some refinements to the ModelBuilder class that is passed to this method which can make defining mapping rules cleaner and more concise.&amp;#160; The ADO.NET Team blogged &lt;a href="http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-api-samples.aspx" target="_blank"&gt;some samples&lt;/a&gt; of how to do this &lt;a href="http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-api-samples.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;

      &lt;ul&gt;
      &lt;li&gt;&lt;u&gt;Pluggable Conventions Support&lt;/u&gt; &lt;/li&gt;
      &lt;/ul&gt;

      &lt;p&gt;EF Code First CTP5 provides new support that allows you to override the “default conventions” that EF Code First honors, and optionally replace them with your own set of conventions.&lt;/p&gt;

      &lt;ul&gt;
      &lt;li&gt;&lt;u&gt;New Change Tracking API &lt;/u&gt;&lt;/li&gt;
      &lt;/ul&gt;

      &lt;p&gt;EF Code First CTP5 exposes a new set of change tracking information that enables you to access Original, Current &amp;amp; Stored values, and State (e.g. Added, Unchanged, Modified, Deleted).&amp;#160; This support is useful in a variety of scenarios.&lt;/p&gt;

      &lt;ul&gt;
      &lt;li&gt;&lt;u&gt;Improved Concurrency Conflict Resolution&lt;/u&gt; &lt;/li&gt;
      &lt;/ul&gt;

      &lt;p&gt;EF Code First CTP5 provides better exception messages that allow access to the affected object instance and the ability to resolve conflicts using current, original and database values.&amp;#160; &lt;/p&gt;

      &lt;ul&gt;
      &lt;li&gt;&lt;u&gt;Raw SQL Query/Command Support&lt;/u&gt; &lt;/li&gt;
      &lt;/ul&gt;

      &lt;p&gt;EF Code First CTP5 now allows raw SQL queries and commands (including SPROCs) to be executed via the SqlQuery and SqlCommand methods exposed off of the DbContext.Database property.&amp;#160; The results of these method calls can be materialized into object instances that can be optionally change-tracked by the DbContext.&amp;#160; This is useful for a variety of advanced scenarios.&lt;/p&gt;

      &lt;ul&gt;
      &lt;li&gt;&lt;u&gt;Full Data Annotations Support&lt;/u&gt; &lt;/li&gt;
      &lt;/ul&gt;

      &lt;p&gt;EF Code First CTP5 now supports all standard DataAnnotations within .NET, and can use them both to perform validation as well as to automatically create the appropriate database schema when EF Code First is used in a database creation scenario.&amp;#160; &lt;/p&gt;

      &lt;h3&gt;&lt;u&gt;Summary&lt;/u&gt;&lt;/h3&gt;

      &lt;p&gt;EF Code First provides an elegant and powerful way to work with data.&amp;#160; I really like it because it is extremely clean and supports best practices, while also enabling solutions to be implemented very, very rapidly.&amp;#160; The code-only approach of the library means that model layers end up being flexible and easy to customize.&lt;/p&gt;

      &lt;p&gt;This week’s CTP5 release further refines EF Code First and helps ensure that it will be really sweet when it ships early next year.&amp;#160; I recommend using NuGet to install and give it a try today.&amp;#160; I think you’ll be pleasantly surprised by how awesome it is.&lt;/p&gt;

      &lt;p&gt;Hope this helps,&lt;/p&gt;

      &lt;p&gt;Scott&lt;/p&gt;
      &lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7658100" width="1" height="1"&gt;
    </content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term=".NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/.NET/default.aspx" />
    <category term="ASP.NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/ASP.NET/default.aspx" />
    <category term="Data" scheme="http://weblogs.asp.net/scottgu/archive/tags/Data/default.aspx" />
    <category term="LINQ" scheme="http://weblogs.asp.net/scottgu/archive/tags/LINQ/default.aspx" />
  </entry>
  <entry>
    <title>Dec 5th Links: ASP.NET, ASP.NET MVC, jQuery, Silverlight, Visual Studio</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/12/05/dec-5th-links-asp-net-asp-net-mvc-jquery-silverlight-visual-studio.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/12/05/dec-5th-links-asp-net-asp-net-mvc-jquery-silverlight-visual-studio.aspx</id>
    <published>2010-12-06T00:31:49Z</published>
    <updated>2010-12-06T00:31:49Z</updated>
    <content type="html">&lt;font size="2" face="arial"&gt;   &lt;p&gt;Here is the latest in my &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/08/29/august-29th-links-net-asp-net-iis-express-silverlight-windows-phone-7.aspx" target="_blank"&gt;link-listing series&lt;/a&gt;.&amp;#160; Also check out my &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/08/25/vs-2010-and-net-4-series.aspx" target="_blank"&gt;VS 2010 and .NET 4 series&lt;/a&gt; for another on-going blog series I’m working on.&lt;/p&gt;    &lt;p&gt;&lt;em&gt;[In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at: &lt;a href="http://twitter.com/scottgu" target="_blank"&gt;twitter.com/scottgu&lt;/a&gt;]&lt;/em&gt;&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;ASP.NET &lt;/u&gt;&lt;/h3&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/jmeier/archive/2010/10/31/asp-net-code-samples-collection.aspx" target="_blank"&gt;ASP.NET Code Samples Collection&lt;/a&gt;: J.D. Meier has a great post that provides a detailed round-up of ASP.NET code samples and tutorials from a wide variety of sources.&amp;#160; Lots of useful pointers.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://blog.lavablast.com/post/2010/12/01/Slash-your-ASPNET-compileload-time.aspx" target="_blank"&gt;Slash your ASP.NET compile/load time without any hard work&lt;/a&gt;: Nice article that details a bunch of optimizations you can make to speed up ASP.NET project load and compile times. You might also want to read my previous blog post on this topic &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/11/01/tip-trick-hard-drive-speed-and-visual-studio-performance.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://stephenwalther.com/blog/archive/2010/11/22/10-essential-tools-for-building-asp-net-websites.aspx" target="_blank"&gt;10 Essential Tools for Building ASP.NET Websites&lt;/a&gt;: Great article by Stephen Walther on 10 great (and free) tools that enable you to more easily build great ASP.NET Websites.&amp;#160; Highly recommended reading.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://www.4guysfromrolla.com/articles/101310-1.aspx" target="_blank"&gt;Optimize Images using the ASP.NET Sprite and Image Optimization Framework&lt;/a&gt;: A nice article by 4GuysFromRolla that discusses how to use the open-source ASP.NET Sprite and Image Optimization Framework (one of the tools recommended by Stephen in the previous article).&amp;#160; You can use this to significantly improve the load-time of your pages on the client.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://www.4guysfromrolla.com/articles/111010-1.aspx" target="_blank"&gt;Formatting Dates, Times and Numbers in ASP.NET&lt;/a&gt;: Scott Mitchell has a great article that discusses formatting dates, times and numbers in ASP.NET.&amp;#160; A very useful link to bookmark.&amp;#160; Also check out James Michael’s &lt;a href="http://geekswithblogs.net/BlackRabbitCoder/archive/2010/11/18/c.net-little-wonders-datetime-is-packed-with-goodies.aspx" target="_blank"&gt;DateTime is Packed with Goodies&lt;/a&gt; blog post for other DateTime tips.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://www.4guysfromrolla.com/articles/110310-1.aspx" target="_blank"&gt;Examining ASP.NET’s Membership, Roles and Profile APIs (Part 18)&lt;/a&gt;: Everything you could possibly want to known about ASP.NET’s built-in Membership, Roles and Profile APIs must surely be in this tutorial series. Part 18 covers how to store additional user info with Membership.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;h3&gt;&lt;u&gt;ASP.NET with jQuery&lt;/u&gt;&lt;/h3&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://stephenwalther.com/blog/archive/2010/11/30/an-introduction-to-jquery-templates.aspx" target="_blank"&gt;An Introduction to jQuery Templates&lt;/a&gt;: Stephen Walther has written an outstanding introduction and tutorial on the new jQuery Template plugin that the ASP.NET team has contributed to the jQuery project.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://encosia.com/2010/11/10/composition-with-jquery-templates-why-and-how/" target="_blank"&gt;Composition with jQuery Templates&lt;/a&gt; and &lt;a href="http://encosia.com/2010/12/02/jquery-templates-composite-rendering-and-remote-loading/" target="_blank"&gt;jQuery Templates, Composite Rendering, and Remote Loading&lt;/a&gt;: Dave Ward has written two nice posts that talk about composition scenarios with jQuery Templates and some cool scenarios you can enable with them. &lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://www.4guysfromrolla.com/articles/120110-1.aspx" target="_blank"&gt;Using jQuery and ASP.NET to Build a News Ticker&lt;/a&gt;: Scott Mitchell has a nice tutorial that demonstrates how to build a dynamically updated “news ticker” style UI with ASP.NET and jQuery.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://scottonwriting.net/sowblog/archive/2010/12/04/checking-all-checkboxes-in-a-gridview-using-jquery.aspx" target="_blank"&gt;Checking All Checkboxes in a GridView using jQuery:&lt;/a&gt; Scott Mitchell has a nice post that covers how to use jQuery to enable a checkbox within a GridView’s header to automatically check/uncheck all checkboxes contained within rows of it.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://west-wind.com/Weblog/posts/762753.aspx" target="_blank"&gt;Using jQuery to POST Form Data to an ASP.NET AJAX Web Service&lt;/a&gt;: Rick Strahl has a nice post that discusses how to capture form variables and post them to an ASP.NET AJAX Web Service (.asmx).&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;h3&gt;&lt;u&gt;ASP.NET MVC&lt;/u&gt;&lt;/h3&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://haacked.com/archive/2010/12/05/asp-net-mvc-diagnostics-using-nuget.aspx" target="_blank"&gt;ASP.NET MVC Diagnostics Using NuGet&lt;/a&gt;: Phil Haack has a nice post that demonstrates how to easily install a diagnostics page (using NuGet) that can help identify and diagnose common configuration issues within your apps.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://yobriefcase.posterous.com/aspnet-mvc3s-jsonvalueproviderfactory" target="_blank"&gt;ASP.NET MVC 3 JsonValueProviderFactory&lt;/a&gt;: James Hughes has a nice post that discusses how to take advantage of the new JsonValueProviderFactory support built into ASP.NET MVC 3.&amp;#160; This makes it easy to post JSON payloads to MVC action methods.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://yobriefcase.posterous.com/practical-jquery-mobile-with-aspnet-mvc" target="_blank"&gt;Practical jQuery Mobile with ASP.NET MVC&lt;/a&gt;: James Hughes has another nice post that discusses how to use the new jQuery Mobile library with ASP.NET MVC to build great mobile web applications.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://benjii.me/2010/11/credit-card-validator-attribute-for-asp-net-mvc-3/" target="_blank"&gt;Credit Card Validator for ASP.NET MVC 3&lt;/a&gt;: Benjii Me has a nice post that demonstrates how to build a [CreditCard] validator attribute that can be used to easily validate credit card numbers are in the correct format with ASP.NET MVC.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;h3&gt;&lt;u&gt;Silverlight&lt;/u&gt;&lt;/h3&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://johnpapa.net/silverlight/slfs10sessions/" target="_blank"&gt;Silverlight FireStarter Keynote and Sessions&lt;/a&gt;: A great blog post from John Papa that contains pointers and descriptions of all the great Silverlight content we published last week at the Silverlight FireStarter.&amp;#160; You can watch all of the talks online.&amp;#160; More details on my keynote and Silverlight 5 announcements can be found &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/12/02/announcing-silverlight-5.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://www.jeffblankenburg.com/post/31-Days-of-Windows-Phone-7.aspx" target="_blank"&gt;31 Days of Windows Phone 7:&lt;/a&gt; 31 great tutorials on how to build Windows Phone 7 applications (using Silverlight).&amp;#160; &lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/delay/archive/2010/11/02/mo-controls-mo-controls-mo-controls-announcing-the-second-release-of-the-silverlight-for-windows-phone-toolkit.aspx" target="_blank"&gt;Silverlight for Windows Phone Toolkit Update&lt;/a&gt;: David Anson has a nice post that discusses some of the additional controls provided with the Silverlight for Windows Phone Toolkit.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;h3&gt;&lt;u&gt;Visual Studio&lt;/u&gt;&lt;/h3&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://visualstudiogallery.msdn.microsoft.com/en-us/872d27ee-38c7-4a97-98dc-0d8a431cc2ed" target="_blank"&gt;JavaScript Editor Extensions&lt;/a&gt;: A nice (and free) Visual Studio plugin built by the web tools team that significantly improves the JavaScript intellisense support within Visual Studio.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/gilf/archive/2010/12/04/quick-tip-html5-intellisense-for-visual-studio-2010.aspx" target="_blank"&gt;HTML5 Intellisense for Visual Studio&lt;/a&gt;: Gil has a blog post that discusses a new extension my team has posted to the Visual Studio Extension Gallery that adds HTML5 schema support to Visual Studio 2008 and 2010.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://vishaljoshi.blogspot.com/2010/11/team-build-web-deployment-web-deploy-vs.html" target="_blank"&gt;Team Build + Web Deployment + Web Deploy + VS 2010 = Goodness&lt;/a&gt;: Visual blogs about how to enable a continuous deployment system with VS 2010, TFS 2010 and the Microsoft Web Deploy framework.&amp;#160; &lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/visualstudio/archive/2010/09/01/emacs-emulation-extension-now-available.aspx" target="_blank"&gt;Visual Studio 2010 Emacs Emulation Extension&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/b/jaredpar/archive/2010/11/30/vsvim-update-released-version-0-9-3.aspx" target="_blank"&gt;VIM Emulation Extension&lt;/a&gt;: Check out these two extensions if you are fond of Emacs and VIM key bindings and want to enable them within Visual Studio 2010.&lt;/p&gt;     &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;Hope this helps,&lt;/p&gt;    &lt;p&gt;Scott&lt;/p&gt; &lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7656517" width="1" height="1"&gt;</content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term=".NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/.NET/default.aspx" />
    <category term="Ajax" scheme="http://weblogs.asp.net/scottgu/archive/tags/Ajax/default.aspx" />
    <category term="ASP.NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/ASP.NET/default.aspx" />
    <category term="jQuery" scheme="http://weblogs.asp.net/scottgu/archive/tags/jQuery/default.aspx" />
    <category term="MVC" scheme="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx" />
    <category term="Visual Studio" scheme="http://weblogs.asp.net/scottgu/archive/tags/Visual+Studio/default.aspx" />
  </entry>
  <entry>
    <title>Announcing Silverlight 5</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/12/02/announcing-silverlight-5.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/12/02/announcing-silverlight-5.aspx</id>
    <published>2010-12-02T18:22:00Z</published>
    <updated>2010-12-02T18:22:00Z</updated>
    <content type="html">
      &lt;P&gt;&lt;FONT size=3&gt;Today at the Silverlight FireStarter event we unveiled the next release of Silverlight.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
      &lt;P&gt;&lt;A href="http://www.microsoft.com/silverlight/future/" mce_href="http://www.microsoft.com/silverlight/future/"&gt;&lt;FONT size=3&gt;Silverlight 5&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=3&gt; adds significant new features and capabilities, and enables developers to create premium media experiences and deliver rich applications across browsers, desktops and devices.&amp;nbsp;&lt;/FONT&gt;&lt;A href="http://www.silverlight.net/news/events/firestarter/" mce_href="http://www.silverlight.net/news/events/firestarter/"&gt;&lt;FONT size=3&gt; In my keynote this morning&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=3&gt; we demonstrated a number of them, and highlighted both the developer productivity Silverlight 5 provides and the great new user experiences it enables.&amp;nbsp; You can watch my keynote &lt;/FONT&gt;&lt;A href="http://www.silverlight.net/news/events/firestarter/" mce_href="http://www.silverlight.net/news/events/firestarter/"&gt;&lt;FONT size=3&gt;here&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=3&gt;.&lt;/FONT&gt;&lt;/P&gt;
      &lt;P&gt;&lt;FONT size=3&gt;A Silverlight 5 beta will be available in the first half of next year, and the final release will ship in the second half of 2011.&lt;/FONT&gt;&lt;/P&gt;&lt;BR&gt;
      &lt;P&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;Premium Media Experiences&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;BR&gt;&lt;FONT size=3&gt;We are seeing great adoption of Silverlight for premium media solutions. In the last few months we’ve seen companies like Canal+, TV2, and Maximum TV launch both live and on-demand Silverlight solutions. &lt;BR&gt;&lt;BR&gt;Silverlight 5 will enable media experiences to go even further by adding: &lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=3&gt;
      &lt;UL&gt;
      &lt;LI&gt;Hardware video decode: Silverlight 5 now supports GPU accelerated video decode, which significantly reduces CPU load for HD video.&amp;nbsp; Using Silverlight 5, even low powered Netbooks will be able to play back 1080p HD content&lt;/LI&gt;&lt;BR&gt;
      &lt;LI&gt;Trickplay: Silverlight 5 now enables variable speed playback of media content on the client with automatic audio pitch correction. This is great for training videos where you want to speed up the trainer while still understanding what he’s saying&lt;/LI&gt;&lt;BR&gt;
      &lt;LI&gt;Improved power awareness will prevent screensavers from kicking in while you’re watching movies while allowing the computer to sleep when video is not playing.&lt;/LI&gt;&lt;BR&gt;
      &lt;LI&gt;Remote-control support is now built-into Silverlight 5 - allowing users to control media playback with remote control devices.&lt;/LI&gt;&lt;BR&gt;&lt;/UL&gt;&lt;/FONT&gt;&lt;BR&gt;
      &lt;P&gt;&lt;STRONG&gt;&lt;FONT size=3&gt;Application Development&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
      &lt;P&gt;&lt;FONT size=3&gt;Silverlight provides a rich application development environment that enables you to build great web delivered applications.&amp;nbsp; &lt;/FONT&gt;&lt;/P&gt;
      &lt;P&gt;&lt;FONT size=3&gt;Silverlight 5 delivers significant improvements for application development including:&lt;/FONT&gt;&lt;/P&gt;
      &lt;UL&gt;
      &lt;P&gt;&lt;FONT size=3&gt;
      &lt;LI&gt;Databinding and MVVM: Silverlight 5 delivers significant data-binding improvements that improve developer productivity and provide better Silverlight/WPF feature convergence.&amp;nbsp; Developers can now debug data-binding expressions, set breakpoints on bindings, and more easily determine errors.&amp;nbsp; Implicit DataTemplates now allow templates to be created across an application to support a particular type by default.&amp;nbsp; Ancestor RelativeSource bindings makes it easier for a DataTemplate to bind to a property on a container control. Binding in style setters allows bindings to be used within styles to reference other properties.&amp;nbsp; And a new DataContextChanged event is being introduced to make handling changes easier. Markup extensions are also now support and allow code to be run at XAML parse time for both properties and event handlers, enabling cutting-edge MVVM support.&lt;/LI&gt;&lt;/FONT&gt;
      &lt;P&gt;&lt;FONT size=3&gt;
      &lt;LI&gt;WCF and RIA Services: Silverlight 5 now includes WS-Trust support.&amp;nbsp; WCF RIA Services improvements include complex type support, better MVVM support, and improved customization of code generation.&amp;nbsp; Silverlight 5’s networking stack also now supports low-latency network scenarios that enable more responsive application scenarios.&lt;/LI&gt;&lt;/FONT&gt;
      &lt;P&gt;&lt;FONT size=3&gt;
      &lt;LI&gt;Text and Printing: Silverlight 5 delivers improved text clarity that enables crisper and cleaner text rendering, multi-column text flow and linked text containers, character and leading support, and full OpenType font support.&amp;nbsp; Silverlight 5 also includes a new Postscript Vector Printing API that provides programmatic control over what you print, and enables printing richer reports and documents.&amp;nbsp; Pivot functionality – which enables developers to build amazing information visualization experiences – will also be provided built-into the Silverlight 5 SDK.&lt;/LI&gt;&lt;/FONT&gt;
      &lt;P&gt;&lt;FONT size=3&gt;
      &lt;LI&gt;Graphics: Silverlight 5 includes immediate mode graphics support that enables developers to take full advantage of the GPU (graphics processing unit) and enables accelerated 3-D graphics support.&amp;nbsp; This new support facilitates much richer data visualization scenarios (make sure to watch the keynote to see some really eye-popping ones).&amp;nbsp;&lt;/LI&gt;&lt;/FONT&gt;
      &lt;P&gt;&lt;FONT size=3&gt;
      &lt;LI&gt;Out of Browser: Silverlight 5 builds on the out-of-browser capabilities we introduced with Silverlight 5.&amp;nbsp; Out of browser applications can now create and manage child windows.&amp;nbsp; Trusted out of browser applications can now also use P/Invoke capabilities to call unmanaged libraries and Win32 APIs.&amp;nbsp; Enhanced group policy support enables enterprises to both lock down and open up security sandbox capabilities of Silverlight 5 applications.&lt;/LI&gt;&lt;/FONT&gt;
      &lt;P&gt;&lt;FONT size=3&gt;
      &lt;LI&gt;Testing Tools: We are adding automated UI testing support for Silverlight applications with Visual Studio 2010.&amp;nbsp; This makes it easy to test Silverlight applications, and automate the functionality of them.&lt;/LI&gt;&lt;/FONT&gt;
      &lt;P&gt;&lt;FONT size=3&gt;
      &lt;LI&gt;Performance: Silverlight 5 support faster application startup, and provides 64-bit browser support.&amp;nbsp; Silverlight 5 also integrates with the new Hardware Acceleration capabilities of IE9, and enables hardware acceleration in windowsless mode.&amp;nbsp;&amp;nbsp;&lt;/LI&gt;&lt;/UL&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;STRONG&gt;&lt;BR&gt;&lt;FONT size=3&gt;Summary&lt;/FONT&gt;&lt;/STRONG&gt;
      &lt;P&gt;&lt;FONT size=3&gt;We are really excited about the great new capabilities that Silverlight 5 will deliver, and look forward to getting your feedback.&amp;nbsp; My keynote is available to watch online &lt;/FONT&gt;&lt;A href="http://www.silverlight.net/news/events/firestarter/" mce_href="http://www.silverlight.net/news/events/firestarter/"&gt;&lt;FONT size=3&gt;here&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=3&gt; if you want to see the new release in action and more information can be found on the &lt;/FONT&gt;&lt;A href="http://www.microsoft.com/silverlight/future/" mce_href="http://www.microsoft.com/silverlight/future/"&gt;&lt;FONT size=3&gt;Silverlight Website&lt;/FONT&gt;&lt;/A&gt;&lt;FONT size=3&gt;.&lt;BR&gt;&amp;nbsp; &lt;BR&gt;Hope this helps,&lt;/FONT&gt;&lt;/P&gt;
      &lt;P&gt;&lt;FONT size=3&gt;Scott&lt;/FONT&gt;&lt;/P&gt;
      &lt;P&gt;&lt;BR&gt;&lt;FONT size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
      &lt;UL&gt;&lt;/UL&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7654199" width="1" height="1"&gt;
    </content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term="Silverlight" scheme="http://weblogs.asp.net/scottgu/archive/tags/Silverlight/default.aspx" />
  </entry>
  <entry>
    <title>Upcoming Web Camps</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/11/21/upcoming-web-camps.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/11/21/upcoming-web-camps.aspx</id>
    <published>2010-11-22T07:08:01Z</published>
    <updated>2010-11-22T07:08:01Z</updated>
    <content type="html">&lt;font size="2" face="arial"&gt;   &lt;p&gt;Earlier this year &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/05/15/worldwide-web-camps.aspx" target="_blank"&gt;I blogged&lt;/a&gt; about some &lt;a href="http://webcamps.ms/upcoming-web-camps.aspx" target="_blank"&gt;Web Camp events&lt;/a&gt; that Microsoft is sponsoring around the world.&amp;#160; These training events provide a great way to learn about a variety of technologies including ASP.NET 4, ASP.NET MVC, VS 2010, Web Matrix, Silverlight, and IE9.&amp;#160; The events are free and the feedback from people attending them has been great.&lt;/p&gt;    &lt;p&gt;A bunch of additional Web Camp events are coming up in the months ahead.&amp;#160; You can find our more about the events and register to attend them for free &lt;a href="http://webcamps.ms/upcoming-web-camps.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;Below is a snapshot of the upcoming schedule as of today:&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;One Day Events&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;One day events focus on teaching you how to build websites using ASP.NET MVC, WebMatrix, OData and more, and include presentations &amp;amp; hands on development. They will be available in 30 countries worldwide.&amp;#160; Below are the current known dates with links to register to attend them for free:&lt;/p&gt;    &lt;div&gt;     &lt;table&gt;&lt;tbody style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;         &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;&lt;strong style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;City&lt;/strong&gt;&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;&lt;strong style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;Country&lt;/strong&gt;&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;&lt;strong style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;Date&lt;/strong&gt;&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;&lt;strong style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;Technology&lt;/strong&gt;&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;&lt;strong style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;Registration Link&lt;/strong&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;Bangalore&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; height: 20px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;India&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;16-Nov-10&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;ASP.NET MVC&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;Already Happened&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Paris&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;France&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;25-Nov-10&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;TBA&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="http://www.facebook.com/Developpeurs.net?v=app_2344061033"&gt;Register Here&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Bad Homburg &lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;Germany&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;30-Nov-10&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;ASP.NET MVC&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="https://msevents.microsoft.com/CUI/InviteOnly.aspx?EventID=E7-69-78-4A-1D-D4-AE-8E-D2-B6-97-FC-E7-2D-A7-FF&amp;amp;Culture=de-DE"&gt;Register Here&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Bogota&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;Colombia&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;30-Nov-10&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;Multiple&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="https://msevents.microsoft.com/CUI/InviteOnly.aspx?EventID=25-28-C6-82-E9-9E-01-28-1F-09-4B-7A-EE-04-65-E8&amp;amp;Culture=es-CO"&gt;Register Here&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Chennai&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;India&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;1-Dec-10&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;ASP.NET MVC&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="https://msevents.microsoft.com/CUI/InviteOnly.aspx?EventID=21-27-DA-75-C6-21-7C-0C-EC-0B-9D-1B-6C-42-A1-D9&amp;amp;Culture=en-IN"&gt;Register Here&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; height: 20px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;Seoul&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;Korea&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;2-Dec-10&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;Web Matrix&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;Coming Soon&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Pune&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;India&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;3-Dec-10&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;ASP.NET MVC&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="https://msevents.microsoft.com/CUI/InviteOnly.aspx?EventID=21-27-DA-75-C6-21-7C-0C-D8-1C-BF-45-3E-60-33-15&amp;amp;Culture=en-IN"&gt;Register Here&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Moulineaux&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;France&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;8-Dec-10&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;TBA&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="http://www.facebook.com/Developpeurs.net?v=app_2344061033"&gt;Register Here&lt;/a&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="http://www.facebook.com/Developpeurs.net?v=app_2344061033"&gt;&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="33"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="33" width="113"&gt;Sarajevo&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;Bosnia and Herzegovina&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;10-Dec-10&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;ASP.NET MVC&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="https://msevents.microsoft.com/cui/EventDetail.aspx?culture=en-US&amp;amp;EventID=1032467612&amp;amp;IO=ZveLgCOzzm%2fmYpz%2bTZ%2fhcg%3d%3d"&gt;Register Here&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;Toronto&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; height: 20px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;Canada&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;11-Dec-10&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;ASP.NET MVC&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="https://msevents.microsoft.com/cui/EventDetail.aspx?culture=en-CA&amp;amp;EventID=1032471363&amp;amp;IO=K7P4uWse6WsFXbYMJiVnSg%3d%3d"&gt;Register Here&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Bad Homburg &lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;Germany&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;16-Dec-10&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;ASP.NET MVC&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="https://msevents.microsoft.com/cui/EventDetail.aspx?culture=de-DE&amp;amp;EventID=1032464992&amp;amp;IO=dNg4FIVr1d8kJHBlVZcXWQ%3d%3d"&gt;Register Here&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Moulineaux&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;France&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;11-Jan-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;TBA&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="http://www.facebook.com/Developpeurs.net?v=app_2344061033"&gt;Register Here&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Cape Town &lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;South Africa &lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;22-Jan-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;Web Matrix&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;Coming Soon&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Johannesburg&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;South Africa &lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;29-Jan-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;Web Matrix&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;Coming Soon&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;Tunis&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; height: 15px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" valign="top"&gt;Tunisia&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;1-Feb-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;ASP.Net MVC&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="https://msevents.microsoft.com/CUI/InviteOnly.aspx?EventID=98-18-95-91-45-1C-93-4D-B4-74-8F-69-F9-DD-59-36&amp;amp;Culture=en-US"&gt;Register Here&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Cape Town &lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;South Africa &lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;12-Feb-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;ASP.Net MVC&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;Coming Soon&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;San Francisco, CA&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;USA-West&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;18-Feb-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;ASP.NET MVC&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;Coming Soon&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Johannesburg&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;South Africa &lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;19-Feb-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;ASP.Net MVC&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;Coming Soon&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Redmond, WA&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;USA-West&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;18-Mar-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;Odata&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;Coming Soon&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Munich&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;Germany&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;31-Mar-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;Web Matrix&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="https://msevents.microsoft.com/cui/EventDetail.aspx?culture=de-DE&amp;amp;EventID=1032463703&amp;amp;IO=K3%2fzIVonIuHOGItPTyQqxA%3d%3d"&gt;Register Here&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Moulineaux&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;France&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;5-Apr-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;TBA&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="http://www.facebook.com/Developpeurs.net?v=app_2344061033"&gt;Register Here&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Moulineaux&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;France&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;17-May-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;TBA&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="http://www.facebook.com/Developpeurs.net?v=app_2344061033"&gt;Register Here&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="20"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="20" width="113"&gt;Irvine, CA&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;USA-West&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;10-Jun-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;ASP.NET MVC&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;Coming Soon&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="28"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="28" width="113"&gt;Moulineaux&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="89"&gt;France&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;14-Jun-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="97"&gt;TBA&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="115"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(125,133,0); font-size: 13px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; background-origin: initial; background-clip: initial" href="http://www.facebook.com/Developpeurs.net?v=app_2344061033"&gt;Register Here&lt;/a&gt;&lt;/td&gt;         &lt;/tr&gt;       &lt;/tbody&gt;&lt;/table&gt;   &lt;/div&gt;    &lt;div&gt;     &lt;h3&gt;&lt;u&gt;Two Day Events&lt;/u&gt;&lt;/h3&gt;      &lt;p&gt;Two day Web Camps go into even more depth.&amp;#160; These events will cover ASP.NET, ASP.NET MVC, WebMatrix and OData, and will have presentations on day 1 with hands on development on day 2.&amp;#160; Below are the current dates for the events:&lt;/p&gt;      &lt;table&gt;&lt;tbody&gt;         &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="32"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="32" width="90"&gt;&lt;strong style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;City&lt;/strong&gt;&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;&lt;strong style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;Country&lt;/strong&gt;&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;&lt;strong style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;Date&lt;/strong&gt;&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="108"&gt;&lt;strong style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;Presenters&lt;/strong&gt;&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="121"&gt;&lt;strong style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial"&gt;Registration Link&lt;/strong&gt;&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="32"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="32" width="90"&gt;Hyderabad&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;India&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;18-Nov-10&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="108"&gt;James Senior &amp;amp;              &lt;br /&gt;Jon Galloway&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="121"&gt;Already Happened&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="32"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="32" width="90"&gt;Amsterdam&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;Netherlands&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;20-Jan-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="108"&gt;James Senior &amp;amp;              &lt;br /&gt;Scott Hanselman&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="121"&gt;Coming Soon&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="32"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="32" width="90"&gt;Paris&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;France&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;25-Jan-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="108"&gt;James Senior &amp;amp;              &lt;br /&gt;Scott Hanselman&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="121"&gt;Coming Soon&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="32"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="32" width="90"&gt;Austin, TX&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;USA&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;7-Mar-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="108"&gt;James Senior &amp;amp;              &lt;br /&gt;Scott Hanselman&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="121"&gt;Coming Soon&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="32"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="32" width="90"&gt;Buenos Aires&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;Argentina&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;14-Mar-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="108"&gt;James Senior &amp;amp;              &lt;br /&gt;Phil Haack&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="121"&gt;Coming Soon&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="32"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="32" width="90"&gt;São Paulo&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;Brazil&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;18-Mar-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="108"&gt;James Senior &amp;amp;              &lt;br /&gt;Phil Haack&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="121"&gt;Coming Soon&lt;/td&gt;         &lt;/tr&gt;          &lt;tr style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-origin: initial; background-clip: initial" height="32"&gt;           &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" height="32" width="90"&gt;Silicon Valley&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;USA&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="79"&gt;6-May-11&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="108"&gt;James Senior &amp;amp;              &lt;br /&gt;Doris Chen&lt;/td&gt;            &lt;td style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 13px; vertical-align: baseline; border-left-width: 0px; padding-top: 10px; background-origin: initial; background-clip: initial" width="121"&gt;Coming Soon&lt;/td&gt;         &lt;/tr&gt;       &lt;/tbody&gt;&lt;/table&gt;   &lt;/div&gt;    &lt;h3&gt;&lt;u&gt;More Details&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;You can find the latest details and registration information about upcoming Web Camp events &lt;a href="http://webcamps.ms/upcoming-web-camps.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;Hope this helps,&lt;/p&gt;    &lt;p&gt;Scott&lt;/p&gt; &lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7648808" width="1" height="1"&gt;</content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term=".NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/.NET/default.aspx" />
    <category term="ASP.NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/ASP.NET/default.aspx" />
    <category term="Community News" scheme="http://weblogs.asp.net/scottgu/archive/tags/Community+News/default.aspx" />
    <category term="Talks" scheme="http://weblogs.asp.net/scottgu/archive/tags/Talks/default.aspx" />
  </entry>
  <entry>
    <title>Silverlight Firestarter Event on Dec 2nd</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/11/17/silverlight-firestarter-event-on-dec-2nd.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/11/17/silverlight-firestarter-event-on-dec-2nd.aspx</id>
    <published>2010-11-17T08:17:52Z</published>
    <updated>2010-11-17T08:17:52Z</updated>
    <content type="html">&lt;font size="2" face="arial"&gt;   &lt;p&gt;On December 2nd we are holding a free, &lt;a href="http://www.silverlight.net/news/events/firestarter/" target="_blank"&gt;all-day event&lt;/a&gt; focused on Silverlight.&amp;#160; You can attend it either in person on the Microsoft campus (where you’ll get to network with a bunch of Silverlight experts, and meet the product team), or watch it streamed live online.&amp;#160; &lt;/p&gt;    &lt;p&gt;The all-day event includes a &lt;a href="http://www.silverlight.net/news/events/firestarter/" target="_blank"&gt;ton of great content and presentations&lt;/a&gt; focused on Silverlight development.&amp;#160; It includes a bunch of self-paced labs and walkthrough videos that enable developers that are new to Silverlight to follow along.&amp;#160; It also includes great presentations that will teach new tricks to advanced of Silverlight developers.&amp;#160; Most of the talks during the day will be focused on business application scenarios.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;My Future of Silverlight Keynote&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;I’ll be kicking off the event with a 90 minute keynote on the future of Silverlight. In it I’ll cover our future Silverlight roadmap, and provide a first look at some of the exciting things coming.&amp;#160; If you are interested in Silverlight you won’t want to miss it.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;How to Register&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;&lt;a href="http://www.silverlight.net/news/events/firestarter/" target="_blank"&gt;Click here&lt;/a&gt; to register to attend the event in person, or watch it live on the web.&amp;#160; Both options are available at no cost.&lt;/p&gt;    &lt;p&gt;Hope this helps,&lt;/p&gt;    &lt;p&gt;Scott&lt;/p&gt;    &lt;p&gt;&lt;em&gt;P.S. In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at: &lt;/em&gt;&lt;a href="http://www.twitter.com/scottgu" target="_blank"&gt;twitter.com/scottgu&lt;/a&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt; &lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7645771" width="1" height="1"&gt;</content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term=".NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/.NET/default.aspx" />
    <category term="Community News" scheme="http://weblogs.asp.net/scottgu/archive/tags/Community+News/default.aspx" />
    <category term="Silverlight" scheme="http://weblogs.asp.net/scottgu/archive/tags/Silverlight/default.aspx" />
  </entry>
  <entry>
    <title>“Unplugged” online talk with me this Friday</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/11/16/unplugged-online-talk-with-me-this-friday.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/11/16/unplugged-online-talk-with-me-this-friday.aspx</id>
    <published>2010-11-16T08:04:06Z</published>
    <updated>2010-11-16T08:04:06Z</updated>
    <content type="html">&lt;p&gt;&lt;font size="2"&gt;&lt;font face="Arial"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Update (Nov 19th):&lt;/font&gt;&lt;/strong&gt; An audio download of the talk is now available &lt;a href="http://www.lidnug.org/archives.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Arial"&gt;This Friday (November 19th) I’m going to be doing another &lt;/font&gt;&lt;a href="http://lidnug-nov19.eventbrite.com/" target="_blank"&gt;&lt;font size="2" face="Arial"&gt;online LIDNUG session&lt;/font&gt;&lt;/a&gt;&lt;font size="2" face="Arial"&gt;.&amp;#160; The talk will be from 10:00am to 11:30am Pacific Time.&amp;#160; I do these talks a few times a year and they tend to be pretty fun.&amp;#160; Attendees can submit any questions they want to me, and listen to me answer them live via LiveMeeting. We usually end up having some really good discussions on a wide variety of development related topics. You can learn more and register to attend the event for free &lt;/font&gt;&lt;a href="http://lidnug-nov19.eventbrite.com/" target="_blank"&gt;&lt;font size="2" face="Arial"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font size="2" face="Arial"&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Arial"&gt;Hope to get a chance to chat with some of you there!&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Arial"&gt;Scott&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;font size="2" face="Arial"&gt;P.S. In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at: &lt;/font&gt;&lt;/em&gt;&lt;a href="http://www.twitter.com/scottgu"&gt;&lt;em&gt;&lt;font size="2" face="Arial"&gt;twitter.com/scottgu&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7644961" width="1" height="1"&gt;</content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term=".NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/.NET/default.aspx" />
    <category term="Community News" scheme="http://weblogs.asp.net/scottgu/archive/tags/Community+News/default.aspx" />
    <category term="Talks" scheme="http://weblogs.asp.net/scottgu/archive/tags/Talks/default.aspx" />
  </entry>
  <entry>
    <title>ASP.NET MVC 3: Server-Side Comments with Razor</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/11/12/asp-net-mvc-3-server-side-comments-with-razor.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/11/12/asp-net-mvc-3-server-side-comments-with-razor.aspx</id>
    <published>2010-11-13T01:33:50Z</published>
    <updated>2010-11-13T01:33:50Z</updated>
    <content type="html">&lt;font size="2" face="arial"&gt;   &lt;p&gt;Earlier this week we &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/11/09/announcing-the-asp-net-mvc-3-release-candidate.aspx" target="_blank"&gt;shipped the ASP.NET MVC 3 Release Candidate&lt;/a&gt;.&amp;#160; It supports “go live” deployments, and includes a bunch of great improvements/enhancements on top of the features we enabled earlier with the ASP.NET MVC 3 &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/10/06/announcing-nupack-asp-net-mvc-3-beta-and-webmatrix-beta-2.aspx" target="_blank"&gt;beta&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx" target="_blank"&gt;first preview&lt;/a&gt; releases.&lt;/p&gt;    &lt;p&gt;This is another in a series of “mini-posts” I’m doing that talk about a few of the new ASP.NET MVC 3 Beta/RC features in more detail:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/10/19/asp-net-mvc-3-new-model-directive-support-in-razor.aspx"&gt;New @model keyword in Razor (Oct 19th)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx" target="_blank"&gt;Layouts with Razor (Oct 22nd)&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;Server-Side Comments with Razor (today) &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;In today’s post I’m going to discuss a small, but useful, feature we’ve recently introduced: server-side comment support in Razor.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Why Server Side Comments?&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Scenario: You are working within a view template, and want to temporarily disable some content or view code (potentially to help track down a problem, or to temporarily change the output of your site).&lt;/p&gt;    &lt;p&gt;HTML supports client-side comments (&amp;lt;!-- --&amp;gt;), which you can use to prevent a browser from parsing/running/displaying the HTML content within it.&amp;#160; The problem with using this approach for many scenarios, though, is that the content contained within the comment is still sent down from the server to the client unnecessarily – and the server-side code within the comment will still execute on the server.&amp;#160; &lt;/p&gt;    &lt;p&gt;ASP.NET Web Forms supports a &lt;a href="http://weblogs.asp.net/scottgu/archive/2006/07/09/Tip_2F00_Trick_3A00_-Using-Server-Side-Comments-with-ASP.NET-2.0-.aspx" target="_blank"&gt;server-side comment syntax&lt;/a&gt; (&amp;lt;%-- --%&amp;gt;) that you can use to completely disable content/code/controls within a page.&amp;#160; With server-side comments, the ASP.NET Web Forms compiler completely ignore everything within the &amp;lt;%-- --%&amp;gt; blocks at parse time, and removes the content completely when assembling the page (like the contents wasn’t there at all).&amp;#160; You can learn more about this feature from an older blog post of mine &lt;a href="http://weblogs.asp.net/scottgu/archive/2006/07/09/Tip_2F00_Trick_3A00_-Using-Server-Side-Comments-with-ASP.NET-2.0-.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;One question someone asked me earlier this week was “is there an equivalent way to do this with Razor?”.&amp;#160; The answer is - yes! &lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Server Side Comments with Razor&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Razor now allows you to wrap any code/content/region of a view within a @* comment *@ syntax (which works for both C# and VB templates).&amp;#160; This syntax indicates that the Razor parser should ignore everything within that block and treat it like it isn’t there at all (meaning nothing is ever executed, there is no performance overhead at runtime, and nothing is sent down to the client).&lt;/p&gt;    &lt;p&gt;For example, below I’ve wrapped some HTML content and server-code within a @* *@ block.&amp;#160; This is equivalent to it not being there at all:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_73274D39.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_71E2B45A.png" width="670" height="375" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Notice above how Visual Studio (starting with this week’s ASP.NET MVC 3 RC build) now colorizes comments (by default in green) to make them more visible within the editor.&amp;#160; &lt;/p&gt;    &lt;p&gt;Visual Studio also now enables you to use the comment/uncomment buttons on the text editor toolbar to easily comment/un-comment a block of text/code.&amp;#160; For example, we could select the above @* *@ comment block within the text editor, and then click the “Uncomment” toolbar button (or better yet press Ctrl+K, Ctrl+U) to have VS uncomment the region:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_30D434F6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_488B6C5C.png" width="670" height="375" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;When we do this the editor will automatically uncomment the block for us (saving us some keystrokes):&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_598F9A3F.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_25E72DE1.png" width="670" height="375" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;We could then highlight another region of text/code within the editor, and then either click the “Comment” toolbar button or press Ctrl+K, Ctrl+C to apply a server-side comment:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_64D8AE7C.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_235DFC23.png" width="670" height="375" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;When we do this the editor will automatically comment the block for us (saving us some keystrokes):&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_4D5DFA4B.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_1302846A.png" width="670" height="375" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Summary&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Server-side comments are a small, but useful, feature that can come in handy in a variety of circumstances.&amp;#160; Razor now enables server-side comments at runtime, and Visual Studio provides nice tooling support for them at development time.&lt;/p&gt;    &lt;p&gt;Hope this helps,&lt;/p&gt;    &lt;p&gt;Scott&lt;/p&gt;    &lt;p&gt;&lt;i&gt;P.S. In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at: &lt;/i&gt;&lt;a href="http://www.twitter.com/scottgu"&gt;twitter.com/scottgu&lt;/a&gt;&lt;/p&gt; &lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7641686" width="1" height="1"&gt;</content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term=".NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/.NET/default.aspx" />
    <category term="ASP.NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/ASP.NET/default.aspx" />
    <category term="Community News" scheme="http://weblogs.asp.net/scottgu/archive/tags/Community+News/default.aspx" />
    <category term="MVC" scheme="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx" />
  </entry>
  <entry>
    <title>A few quick ASP.NET MVC 3 Installation Notes</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/11/11/a-few-quick-asp-net-mvc-3-installation-notes.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/11/11/a-few-quick-asp-net-mvc-3-installation-notes.aspx</id>
    <published>2010-11-12T06:27:05Z</published>
    <updated>2010-11-12T06:27:05Z</updated>
    <content type="html">&lt;font size="2"&gt;   &lt;p&gt;&lt;font face="Arial"&gt;On Tuesday &lt;/font&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/11/09/announcing-the-asp-net-mvc-3-release-candidate.aspx" target="_blank"&gt;&lt;font face="Arial"&gt;I blogged&lt;/font&gt;&lt;/a&gt;&lt;font face="Arial"&gt; about the recent release of the &lt;/font&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/11/09/announcing-the-asp-net-mvc-3-release-candidate.aspx" target="_blank"&gt;&lt;font face="Arial"&gt;ASP.NET MVC 3 RC build&lt;/font&gt;&lt;/a&gt;&lt;font face="Arial"&gt;.&amp;#160; You can read more about it &lt;/font&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/11/09/announcing-the-asp-net-mvc-3-release-candidate.aspx" target="_blank"&gt;&lt;font face="Arial"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font face="Arial"&gt;.&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Arial"&gt;This post is a quick follow-up post that discusses a few installation issues that we’ve seen people run into - and how to fix them:&lt;/font&gt;&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;&lt;font face="Arial"&gt;ASP.NET MVC 3 RC and C#/VB Async CTP&lt;/font&gt;&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;&lt;font face="Arial"&gt;Two weeks ago the VS languages team &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/en-us/vstudio/async.aspx" target="_blank"&gt;&lt;font face="Arial"&gt;released an early preview&lt;/font&gt;&lt;/a&gt;&lt;font face="Arial"&gt; of some cool language improvements to VB and C# that we are working on for asynchronous programming.&amp;#160; Unfortunately it isn’t possible to have both the Async CTP and the ASP.NET MVC 3 RC installed on the same machine at the same time.&amp;#160; You instead need to choose one or the other right now – installing both will cause problems.&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Arial"&gt;If you’ve already installed the Async CTP and want to install the ASP.NET MVC 3 RC, then you need to use Add/Remove Programs and uninstall the Async CTP.&amp;#160; Once it is uninstalled, then you can safely install the ASP.NET MVC 3 RC build on your machine without problems.&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Arial"&gt;If you’ve already installed both the Async CTP and ASP.NET MVC 3 RC on the same machine, then you will likely experience issues in VS with debugging (and potentially other things) not working.&amp;#160; To fix this, go to Add/Remove Programs and uninstall &lt;u&gt;both&lt;/u&gt; the ASP.NET MVC 3 RC build (including the VS Tools components for it) &lt;u&gt;and&lt;/u&gt; the Async CTP. Once you’ve uninstalled both your machine will be back to a clean state and working fine.&amp;#160; You can then choose to install either the Async CTP or ASP.NET MVC 3 RC and it will work fine.&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Arial"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Update:&lt;/font&gt;&lt;/strong&gt; Drew Miller from the ASP.NET team has a good blog post &lt;a href="http://drew-prog.blogspot.com/2010/11/how-to-uninstall-microsoft-aspnet-mvc-3.html" target="_blank"&gt;here&lt;/a&gt; that covers how to &lt;a href="http://drew-prog.blogspot.com/2010/11/how-to-uninstall-microsoft-aspnet-mvc-3.html" target="_blank"&gt;uninstall all the pieces&lt;/a&gt; of ASP.NET MVC 3 RC.&lt;/font&gt;&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;&lt;font face="Arial"&gt;Razor Intellisense and Resharper&lt;/font&gt;&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;&lt;font face="Arial"&gt;ReSharper is a popular product from JetBrains that enhances Visual Studio’s intellisense and code editing features.&amp;#160; If you have ReSharper installed and want to take advantage of the Razor intellisense support we added to the ASP.NET MVC 3 RC build, please &lt;/font&gt;&lt;a href="http://blogs.jetbrains.com/dotnet/2010/11/razor-intellisense-and-resharper/" target="_blank"&gt;&lt;font face="Arial"&gt;read this blog post from JetBrains&lt;/font&gt;&lt;/a&gt;&lt;font face="Arial"&gt; which discusses ways to use them together today.&lt;/font&gt;&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;&lt;font face="Arial"&gt;NuPack/NuGet Schema and Feed Updates&lt;/font&gt;&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;&lt;font face="Arial"&gt;We’ve made some schema and feed modifications to NuGet since the original preview release of it that will prevent you from updating packages that were added with the original preview build.&amp;#160; When updating to the ASP.NET MVC 3 RC, you’ll need to delete your existing packages and re-add them to your project to account for this.&amp;#160; You can do this by deleting the packages from disk, and then run the install-package command again. &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Arial"&gt;Hope this helps,&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Arial"&gt;Scott&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;i&gt;&lt;font face="Arial"&gt;P.S. In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at: &lt;/font&gt;&lt;/i&gt;&lt;a href="http://www.twitter.com/scottgu" target="_blank"&gt;&lt;font face="Arial"&gt;twitter.com/scottgu&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; &lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7641044" width="1" height="1"&gt;</content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term=".NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/.NET/default.aspx" />
    <category term="ASP.NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/ASP.NET/default.aspx" />
    <category term="Community News" scheme="http://weblogs.asp.net/scottgu/archive/tags/Community+News/default.aspx" />
    <category term="MVC" scheme="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx" />
  </entry>
  <entry>
    <title>Announcing the ASP.NET MVC 3 Release Candidate</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/11/09/announcing-the-asp-net-mvc-3-release-candidate.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/11/09/announcing-the-asp-net-mvc-3-release-candidate.aspx</id>
    <published>2010-11-09T15:53:57Z</published>
    <updated>2010-11-09T15:53:57Z</updated>
    <content type="html">&lt;font size="2" face="arial"&gt;   &lt;p&gt;This morning the ASP.NET team shipped the &lt;a href="http://go.microsoft.com/fwlink/?LinkID=191797" target="_blank"&gt;ASP.NET MVC 3 RC&lt;/a&gt; (release candidate). You can download it &lt;a href="http://go.microsoft.com/fwlink/?LinkID=191797" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;ASP.NET MVC 3 is a pretty sweet release, and adds a ton of new functionality and refinements.&amp;#160; It is also backwards compatible with ASP.NET MVC V1 and V2 – which makes it easy to upgrade existing apps (read the release notes for the exact steps to do so).&amp;#160; You can learn more about some of the great capabilities in ASP.NET MVC 3 from previous blog posts I’ve done about it:&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx" target="_blank"&gt;Introducing Razor – a new View Engine for ASP.NET&lt;/a&gt; (July) &lt;/li&gt;      &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx" target="_blank"&gt;ASP.NET MVC 3 Preview 1&lt;/a&gt; (July) &lt;/li&gt;      &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/10/06/announcing-nupack-asp-net-mvc-3-beta-and-webmatrix-beta-2.aspx" target="_blank"&gt;ASP.NET MVC 3 Beta&lt;/a&gt; (Oct) &lt;/li&gt;      &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/10/19/asp-net-mvc-3-new-model-directive-support-in-razor.aspx" target="_blank"&gt;ASP.NET MVC 3: @model keyword in Razor&lt;/a&gt; (Oct) &lt;/li&gt;      &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/10/22/asp-net-mvc-3-layouts.aspx" target="_blank"&gt;ASP.NET MVC 3: Layouts with Razor&lt;/a&gt; (Oct) &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;Today’s &lt;a href="http://go.microsoft.com/fwlink/?LinkID=191797" target="_blank"&gt;ASP.NET MVC 3 RC build&lt;/a&gt; includes several additional feature refinements (in addition to bug fixes, tooling improvements, perf tunings, etc).&amp;#160; This blog post covers the improvements &lt;em&gt;specific to today’s release&lt;/em&gt;.&amp;#160; Please review my previous posts to learn more about the many, many other ASP.NET MVC 3 features and improvements introduced in prior previews/betas.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Razor Intellisense within Visual Studio&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Colorization and intellisense support for Razor-based view templates is now supported within Visual Studio and the free Visual Web Developer Express.&amp;#160; &lt;/p&gt;    &lt;p&gt;Intellisense works for HTML, C#, VB, JavaScript and CSS when editing within razor based view templates:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_49F9DE0C.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_56F3BE1D.png" width="506" height="357" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;You get full C#/VB code intellisense – including against HTML helper methods (all of the existing Html helper methods in ASP.NET MVC also work just fine in Razor based views):&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_0408AAEC.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_3BDAEF0F.png" width="420" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;We also provide intellisense for Razor keywords and directives:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_5B1D95E2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_6C8DF6BA.png" width="402" height="117" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Note below how after setting the @model directive to be a Product, the strongly-typed HTML helpers (and the “Model” property within the template) are now typed correctly to provide intellisense for a “Product” class:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_2BEBAA4B.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_71FC675E.png" width="490" height="416" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;We are still doing final performance tuning on the editor (and have several optimizations that just missed today’s build).&amp;#160; If you encounter a scenario where intellisense either doesn’t seem to work or seems slower than it should be – please send us a repro so that we can verify that our latest builds have it fixed.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;NuGet Package Manager&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/10/06/announcing-nupack-asp-net-mvc-3-beta-and-webmatrix-beta-2.aspx" target="_blank"&gt;I blogged&lt;/a&gt; about a new, free, open source package manager last month - which at the time we were calling “NuPack”.&amp;#160; We’ve since &lt;a href="http://haacked.com/archive/2010/10/29/nupack-is-now-nuget.aspx" target="_blank"&gt;renamed NuPack to NuGet&lt;/a&gt;. Today’s ASP.NET MVC 3 release automatically installs it as part of the setup.&lt;/p&gt;    &lt;p&gt;You can use NuGet to easily download and install both commercial and open source libraries within your projects.&amp;#160; For example, to install NHibernate and a LINQ extension library that someone has built for it, I could type “install-package NHibernate.Linq” within the NuGet package manager console inside Visual Studio:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_62E58884.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_41F215DD.png" width="686" height="129" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;When I press enter NuGet will automatically download all of the libraries (and their dependencies) and setup my ASP.NET MVC 3 project to use them:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_3D0F6221.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_2DF88347.png" width="686" height="261" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;There are now hundreds of open source .NET libraries within the NuGet package feed, and the list will continue to grow over time.&amp;#160; &lt;/p&gt;    &lt;p&gt;We think NuGet will enable all .NET developers (not just ASP.NET MVC ones) to be able to more easily leverage and share functionality across the community, and make building .NET&amp;#160; applications even better.&amp;#160; &lt;/p&gt;    &lt;p&gt;&lt;u&gt;Watch Scott Hanselman’s PDC Talk&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;Scott Hanselman gave the highest-rated talk at PDC this year, which he called “ASP.NET + Packaging + Open Source = Crazy Delicious”.&amp;#160; It is a “no slides” talk that demonstrates how to code an application from start to finish using ASP.NET MVC 3, Razor, NuGet, EF Code First, SQL CE and a bunch of other cool things.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://player.microsoftpdc.com/Session/e0c3ce51-9869-456c-a197-63dc0283f57e" target="_blank"&gt;&lt;img alt="image" src="http://www.hanselman.com/blog/content/binary/WindowsLiveWriter/defa84dca37d_10F5/image_3.png" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;You can &lt;a href="http://player.microsoftpdc.com/Session/e0c3ce51-9869-456c-a197-63dc0283f57e" target="_blank"&gt;watch the talk online&lt;/a&gt; or download it (by right-clicking and choosing “save as” from one of the links below):&lt;/p&gt;    &lt;p&gt;- &lt;a href="http://videoaz.microsoftpdc.com/vod/downloads/FT01_Low.wmv" target="_blank"&gt;Low Bandwidth WMV Video (about 258 megs)&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;- &lt;a href="http://videoaz.microsoftpdc.com/vod/downloads/FT01_Low.mp4" target="_blank"&gt;Low Bandwidth MP4 Video (about 120 megs)&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;I highly recommend watching it – it is both entertaining, and demonstrates how all the pieces of the ASP.NET MVC 3 stack (and especially NuGet) fit together.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Partial Page Output Caching&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;ASP.NET MVC has supported output caching of full page responses since V1.&amp;#160; With ASP.NET MVC V3 (starting with today’s RC) we are also enabling support for partial page output caching – which allows you to easily output cache regions or fragments of a response as opposed to the entire thing.&amp;#160; This ends up being super useful in a lot of scenarios.&lt;/p&gt;    &lt;p&gt;Output caching just a region of a page is really easy to-do.&amp;#160; Simply encapsulate the region you want to output cache within a child action that you invoke from within the view that you are rendering.&amp;#160; For example, below I have a product listing page, and I want to output a “Daily Specials” section on the page as well:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_5F17BDE7.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_1E093E83.png" width="727" height="363" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Above I’m using the Html.Action() helper method to call the SalesController.DailySpecials() child action method.&amp;#160; Notice that I’m passing a category parameter to it above – which will allow me to customize the “Daily Specials” I display based on what types of products the user is currently browsing (that way if they are browsing “computer” products I can display a list of computer specials, and if they are browsing “baby” products I can display diaper specials).&lt;/p&gt;    &lt;p&gt;Below is a simple implementation of the SalesController.DailySpecials() method.&amp;#160; It retrieves an appropriate list of products and then renders back a response using a Razor partial view template:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_19268AC7.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_0A0FABED.png" width="505" height="158" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Notice how the DailySpecials method above has an [OutputCache] attribute on it.&amp;#160; This indicates that the partial content rendered by it should be cached (for 3600 seconds/1 hour).&amp;#160; We are also indicating that the cached content should automatically vary based on the category parameter. &lt;/p&gt;    &lt;p&gt;If we have 10 categories of products, our DailySpecials method will end up caching 10 different lists of specials – and the appropriate specials list (computers or diapers) will be output depending upon what product category the user is browsing in.&amp;#160; Importantly: no database access or processing logic will happen if the partial content is served out of the output cache – which will reduce the load on our server and speed up the response time.&lt;/p&gt;    &lt;p&gt;This new mechanism provides a pretty clean and easy way to add partial-page output caching to your applications.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Unobtrusive JavaScript and Validation&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;I discussed several of the validation and JavaScript/AJAX improvements coming in ASP.NET MVC 3 with in &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx" target="_blank"&gt;my blog post&lt;/a&gt; about the &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx" target="_blank"&gt;first ASP.NET V3 preview release&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;One of the nice enhancements with ASP.NET MVC V3 is that the AJAX and Validation helpers in ASP.NET MVC now both use an &lt;a href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript"&gt;unobtrusive JavaScript&lt;/a&gt; approach by default. Unobtrusive JavaScript avoids injecting inline JavaScript into HTML markup, and instead enables cleaner separation of behavior using the new HTML 5 “data-“ convention (which conveniently works on older browsers – including IE6 - as well). This makes your HTML smaller and cleaner, and makes it easier to optionally swap out or customize JS libraries.&amp;#160; The Validation helpers in ASP.NET MVC 3 also now use the jQueryValidate plugin by default.&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Client Side Validation On By Default&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;With previous versions of ASP.NET MVC (including last month’s ASP.NET MVC V3 beta) you needed to explicitly call Html.EnableClientValidation() within your views in order to enable client-side validation to take place.&amp;#160; Starting with today’s RC that is no longer required, and client-side validation (using an unobtrusive approach) is now enabled by default (you can turn this off if you want through a config setting in web.config). &lt;/p&gt;    &lt;p&gt;You do still need to reference the appropriate jQuery+jQuery Validation libraries within your site for the client-side validation to light-up.&amp;#160; Because you explicitly reference the JavaScript files, you can choose to either host them on your own server or reference them from a CDN (content delivery network) like Microsoft’s or Google’s.&amp;#160; &lt;/p&gt;    &lt;p&gt;&lt;u&gt;Remote Validator&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;An additional validation feature that is new with today’s RC is support for a new [Remote] validation attribute that enables you to take advantage of the jQuery Validation plug-in’s remote validator support.&amp;#160; This enables the client-side validation library to automatically call a custom method you define on the server to perform validation logic that can only be done server-side.&amp;#160; It provides a very clean way to integrate scenarios like this within your client-side validation experience.&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Granular Request Validation&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;ASP.NET MVC has built-in request validation support that helps automatically protect against XSS and HTML injection attacks.&amp;#160; Sometimes, though, you want to explicitly turn off request validation for some scenarios where you want users to be able to post HTML content (for example: blog authoring or CMS content editing).&amp;#160; &lt;/p&gt;    &lt;p&gt;You can now add a [SkipRequestValidation] attribute to models or viewmodels that disables request validation on a per-property basis during model binding:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_295252C0.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_76824C4B.png" width="420" height="203" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Adding the above attribute to your model/viewmodel enables you to set it once and have it apply in all scenarios.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Other Improvements in the RC&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Below is a partial list of other nice improvements in today’s RC:&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Improved “New Project” Dialog Box:&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;When you create an ASP.NET MVC 3 Project you are presented with a dialog like below:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_2EC0C364.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_3FC4F147.png" width="517" height="464" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;The above dialog is now extensible, and you can add additional starter templates, view engines, and unit test project frameworks to it.&amp;#160; We’ll be releasing additional starter templates over time (that will show up in the list) to make it even easier to get up and running on new projects.&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Scaffolding Improvements&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;A number of small, but nice, improvements have been made to the default ASP.NET MVC scaffold templates.&amp;#160; The templates now do a better job of identifying ID/Primary Key properties on models, and handle them appropriately (for example: they now create appropriate links for edit/delete/etc).&amp;#160; The Create/Edit scaffolds also now use Html.EditorFor() by default instead of Html.TextBoxFor() – which makes it easier for you to customize/tweak how your models are displayed.&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Add-View Dialog Box Improvements&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;When you use the Add-&amp;gt;View dialog box to add a view that is strongly-typed, the Add View dialog box now filters out more non-applicable types and is sorted/organized in a way that makes it easier to find what you are looking for.&lt;/p&gt;    &lt;p&gt;&lt;u&gt;Session-less Controller Support&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;You can now indicate whether you want a Controller class to use session-state – and if so whether you want it to be read/write or readonly.&amp;#160; &lt;/p&gt;    &lt;p&gt;&lt;u&gt;Razor Model Dynamic By Default&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;If you do not specify a @model directive within your Razor views, the “Model” property on the page will now default to dynamic instead of object.&amp;#160; This enables you to perform late-binding against the model type.&amp;#160; Previously you had to add a &lt;a href="mailto:&amp;lsquo;@model"&gt;‘@model&lt;/a&gt; dynamic” to the top of the file to do this.&lt;/p&gt;    &lt;p&gt;&lt;u&gt;New Overloads for Html.LabelFor() and Html.LabelForModel()&lt;/u&gt;&lt;/p&gt;    &lt;p&gt;New method overloads have been added for the LabelFor() and LabelForModel() helper methods that enable you to optionally specify or override the label text.&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Download&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;A direct link to an installer for the ASP.NET MVC 3 RC can be found &lt;a href="http://go.microsoft.com/fwlink/?LinkID=191797" target="_blank"&gt;here&lt;/a&gt;.&amp;#160; It works with both VS 2010 and the free Visual Web Developer 2010 Express.&lt;/p&gt;    &lt;p&gt;Please make sure to uninstall any previous ASP.NET MVC 3 releases you have installed on your system (as well as any previous ASP.NET Web Pages setups that you might have installed).&lt;/p&gt;    &lt;h3&gt;&lt;u&gt;Summary&lt;/u&gt;&lt;/h3&gt;    &lt;p&gt;Today’s ASP.NET MVC 3 RC build contains a bunch of goodness that makes web development with ASP.NET MVC better than ever.&amp;#160; If you have questions or suggestions about the release, or find issues/bugs with it, please post them to the &lt;a href="http://forums.asp.net/1146.aspx" target="_blank"&gt;ASP.NET MVC forum&lt;/a&gt; on &lt;a href="http://www.asp.net"&gt;www.asp.net&lt;/a&gt;.&amp;#160; The ASP.NET MVC team monitors this forum closely and will be able to help.&lt;/p&gt;    &lt;p&gt;We plan on spending the next few weeks monitoring feedback, tuning performance, and fixing the final set of bugs.&amp;#160; Thanks in advance for any issues you send our way!&lt;/p&gt;    &lt;p&gt;Hope this helps,&lt;/p&gt;    &lt;p&gt;Scott&lt;/p&gt;    &lt;p&gt;&lt;i&gt;P.S. In addition to blogging, I am also now using Twitter for quick updates and to share links. Follow me at: &lt;/i&gt;&lt;a href="http://www.twitter.com/scottgu" target="_blank"&gt;twitter.com/scottgu&lt;/a&gt;&lt;/p&gt; &lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7638778" width="1" height="1"&gt;</content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term=".NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/.NET/default.aspx" />
    <category term="ASP.NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/ASP.NET/default.aspx" />
    <category term="Community News" scheme="http://weblogs.asp.net/scottgu/archive/tags/Community+News/default.aspx" />
    <category term="MVC" scheme="http://weblogs.asp.net/scottgu/archive/tags/MVC/default.aspx" />
  </entry>
  <entry>
    <title>Silverlight Questions</title>
    <link rel="alternate" type="text/html" href="http://weblogs.asp.net/scottgu/archive/2010/11/04/silverlight-questions.aspx" />
    <id>http://weblogs.asp.net/scottgu/archive/2010/11/04/silverlight-questions.aspx</id>
    <published>2010-11-05T03:06:39Z</published>
    <updated>2010-11-05T03:06:39Z</updated>
    <content type="html">&lt;font size="2" face="arial"&gt;   &lt;p&gt;Over the last week there has been a lot of confusion/concern about Silverlight that occurred from an interview given at the PDC conference last week.&amp;#160; A few days ago Bob Muglia (President of our Server and Tools Division) posted a &lt;a href="http://team.silverlight.net/announcement/pdc-and-silverlight/" target="_blank"&gt;blog post&lt;/a&gt; on the Silverlight Team blog that helped clarify what he said in the interview that caused the controversy.&amp;#160; You can read his post &lt;a href="http://team.silverlight.net/announcement/pdc-and-silverlight/" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;Three of the things that he explicitly said in the interview (and which were reported in the article - but unfortunately lost in the public reaction to it) were:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;Silverlight is very important and strategic to Microsoft. &lt;/li&gt;      &lt;li&gt;We’re working hard on the next release of Silverlight, and it will continue to be cross-browser and cross-platform, and run on Windows and Mac. &lt;/li&gt;      &lt;li&gt;Silverlight is a core application development platform for Windows, and it’s the development platform for Windows Phone. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;In his &lt;a href="http://team.silverlight.net/announcement/pdc-and-silverlight/" target="_blank"&gt;blog post&lt;/a&gt; he expanded more to discuss some of the core areas we are focusing on with Silverlight going forward: &lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;strong&gt;Client Apps&lt;/strong&gt; (both inside and outside the browser) - with a particular emphasis on enterprise business applications &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Apps that run on Devices&lt;/strong&gt; - Silverlight is now the client programming model for Windows Phone and Windows Embedded (which includes things like TVs) &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Media Solutions&lt;/strong&gt; – Silverlight will continue to pioneer premium media capabilities and experiences &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;The “strategy shift” comment he made in the interview was intended to be about us increasing our focus on the above three areas as key scenarios where we think we can really differentiate and add a ton of value with Silverlight.&amp;#160; These are not new areas but rather core things we’ve always focused on with Silverlight and are the primary scenarios customers use it for today.&amp;#160; You’ll see even more focus on these areas in future Silverlight releases.&lt;/p&gt;    &lt;p&gt;Where our strategy has shifted since we first started working on Silverlight is that the number of Internet connected devices out there in the world has increased significantly in the last 2 years (not just with phones, but also with embedded devices like TVs), and trying to get a single implementation of a runtime across all of them is no longer really practical (many of the devices are closed platforms that do not allow extensibility).&amp;#160; This is true for any single runtime implementation - whether it is Silverlight, Flash, Java, Cocoa, a specific HTML5 implementation, or something else.&amp;#160; If people want to have maximum reach across *&lt;b&gt;all&lt;/b&gt;* devices then HTML will provide the broadest reach (this is true with HTML4 today - and will eventually be true with HTML5 in the future).&amp;#160; One of the things we as a company are working hard on is making sure we have the best browser and HTML5 implementation on Windows devices through the great work we are doing with IE9.&lt;/p&gt;    &lt;p&gt;This by no means should be interpreted as Silverlight not being important.&amp;#160; We all know the importance of having the richest possible experiences for key platforms and form-factors, and the value that consumers (both end-users and enterprise) attribute to it. This is not just a true statement for Microsoft platforms - but has obviously been demonstrated by many others as well (Apple being an example).&amp;#160; Silverlight is a strategic technology from Microsoft that enables developers to build those, and we think our investments and focus (in particular with the above three areas) provides us with an incredibly compelling and differentiated platform to do so.&amp;#160; We’ll be sharing more details about some of the great Silverlight improvements coming in the future soon.&lt;/p&gt;    &lt;p&gt;Hope this helps provide some clarity - and apologies again for the confusion and angst this past week,&lt;/p&gt;    &lt;p&gt;Scott&lt;/p&gt;    &lt;p&gt;P.S. I have been on paternity leave the last few weeks taking care of a new baby which is why I’ve been offline recently.&amp;#160; My blogging/twittering will increase again shortly. &lt;/p&gt; &lt;/font&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7636842" width="1" height="1"&gt;</content>
    <author>
      <name>ScottGu</name>
      <uri>http://weblogs.asp.net/members/ScottGu.aspx</uri>
    </author>
    <category term=".NET" scheme="http://weblogs.asp.net/scottgu/archive/tags/.NET/default.aspx" />
    <category term="Community News" scheme="http://weblogs.asp.net/scottgu/archive/tags/Community+News/default.aspx" />
    <category term="Silverlight" scheme="http://weblogs.asp.net/scottgu/archive/tags/Silverlight/default.aspx" />
  </entry>
</feed>